首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为大熊猫中的分类数据行分配散列

为大熊猫中的分类数据行分配散列
EN

Stack Overflow用户
提问于 2016-11-05 12:26:32
回答 2查看 977关注 0票数 5

因此,我有许多熊猫数据框架,包含3列分类变量:

代码语言:javascript
代码运行次数:0
运行
复制
             D              F     False
             T              F     False
             D              F     False
             T              F     False

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

我想给每一行分配一个数字1-18,这样具有相同因素组合的行被分配相同的编号,反之亦然(没有哈希冲突)。

在熊猫身上,最有效的方法是什么?

因此,all_combination_df是一个df,它包含所有因素的可能组合。我正试图将df (如big_df )转换为一个具有独特数字的系列。

代码语言:javascript
代码运行次数:0
运行
复制
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])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-05 13:09:54

更新:作为评论中提到的@user189035 189035,使用分类dtype要好得多,因为它将节省大量内存

我会尝试使用因子化方法:

代码语言:javascript
代码运行次数:0
运行
复制
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

说明:通过这种简单的方法,我们可以将所有列粘合成一个系列:

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 4
EN

Stack Overflow用户

发布于 2016-11-05 12:45:24

在不考虑效率问题的情况下,这将找到重复的行,并为您提供一个字典(类似于问题这里)。

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd, numpy as np

# Define data
d = np.array([["D", "T", "D", "T", "U"], 
["F", "F", "F", "J", "K"], 
[False, False, False, False, True]])
df = pd.DataFrame(d.T)

# Find and remove duplicate rows
df_nodupe = df[~df.duplicated()]

# Make a list
df_nodupe.T.to_dict('list')

{0: ['D', 'F', 'False'],
 1: ['T', 'F', 'False'],
 3: ['T', 'J', 'False'],
 4: ['U', 'K', 'True']}

否则,您可以使用map,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd, numpy as np

# Define data
d = np.array([["D", "T", "D", "T", "U"], 
["F", "F", "F", "J", "K"], 
[False, False, False, False, True]])
df = pd.DataFrame(d.T)
df.columns = ['x', 'y', 'z']

# Define your dictionary of interest
dd = {('D', 'F', 'False'): 0,
 ('T', 'F', 'False'): 1,
 ('T', 'J', 'False'): 2,
 ('U', 'K', 'True'): 3}

# Create a tuple of the rows of interest
df['tupe'] = zip(df.x, df.y, df.z)

# Create a new column based on the row values
df['new_category'] = df.tupe.map(dd)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40438237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档