微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 将哈希值分配给pandas中的分类数据行

所以我有许多带有3列分类变量的pandas数据框:

             D              F     False
             T              F     False
             D              F     False
             T              F     False

第一列和第二列可以采用三个值中的一个.第三个是二进制.因此总共有18个可能的行(并非所有组合都可以在每个数据帧上表示).

我想为每一行分配一个数字1-18,以便具有相同组合因子的行被赋予相同的数字,反之亦然(没有哈希冲突).

在熊猫中最有效的方法是什么?

因此,all_combination_df是具有所有可能的因子组合的df.我试图把big_df这样的df变成一个包含唯一数字的系列

import pandas, itertools

def expand_grid(data_dict):
    """Create a dataframe from every combination of given values."""
    rows = itertools.product(*data_dict.values())
    return pandas.DataFrame.from_records(rows, columns=data_dict.keys())

all_combination_df = expand_grid(
                           {'variable_1': ['D', 'A', 'T'],
                           'variable_2': ['C', 'A', 'B'],
                           'variable_3'     : [True, False]})

big_df = pandas.concat([all_combination_df, all_combination_df, all_combination_df])

最佳答案:

更新:作为@user189035 mentioned in the comment,使用分类dtype要好得多,因为它会节省大量内存

我会尝试使用factorize方法

In [112]: df['category'] = \
     ...:     pd.Categorical(
     ...:         pd.factorize((df.a + '~' + df.b + '~' + (df.c*1).astype(str)))[0])
     ...:

In [113]: df
Out[113]:
   a  b      c category
0  A  X   True        0
1  B  Y  False        1
2  A  X   True        0
3  C  Z  False        2
4  A  Z   True        3
5  C  Z   True        4
6  B  Y  False        1
7  C  Z  False        2

In [114]: df.dtypes
Out[114]:
a             object
b             object
c               bool
category    category
dtype: object

说明:这种简单的方法我们可以将所有列粘合到一个系列中:

In [115]: df.a + '~' + df.b + '~' + (df.c*1).astype(str)
Out[115]:
0    A~X~1
1    B~Y~0
2    A~X~1
3    C~Z~0
4    A~Z~1
5    C~Z~1
6    B~Y~0
7    C~Z~0
dtype: object

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐