2017-04-11 75 views
4

我有这样的数据帧:大熊猫 - 基于价值观的两列组

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
          'fuz', 'baz', 'fuz', 'coo'], 
        'B' : ['one', 'one', 'two', 'two', 
          'three', 'three', 'four', 'one']}) 

它看起来像:

A  B 
0 foo one 
1 bar one 
2 foo two 
3 bar two 
4 fuz three 
5 baz three 
6 fuz four 
7 coo one 

我想创建一个新的列group。一个小组汇总A + B列中唯一值的组合。

它查看每列的唯一值。然后查看另一列中的值,以查看组中已有的元素。

结果是这样的:

A  B group 
0 foo one  1 
1 bar one  1 
2 foo two  1 
3 bar two  1 
4 fuz three  2 
5 baz three  2 
6 fuz four  2 
7 coo one  1 

在这个例子中,我们在A列所有foo将在group1开始在foo。 B中的相关值是onetwo =>也在group1中。在列A的onetwo

的相关联的值是foobarcoo =>也group1

相同的原理给我们group2

什么是最好的方法来做到这一点?

回答

1

难道这是你要找的,这是一个有点硬编码,但具有所需的输出:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
          'fuz', 'baz', 'fuz', 'coo'], 
        'B' : ['one', 'one', 'two', 'two', 
          'three', 'three', 'four', 'one']}) 
g1 = df[df['A']=='foo'] 
df['group'] = np.where(df['A'].isin(g1['A'])|df['B'].isin(g1['B']),1,2) 
0

增加张贴zipa的答案,我想我的代码可以在所有情况下做,例如,DF的数据将被分成3组

df = pd.DataFrame({'A' : ['foo', 'bae', 'foo', 'bar', 
          'fuz', 'baz', 'fzz', 'coo'], 
        'B' : ['one', 'one', 'two', 'two', 
          'three', 'three', 'four', 'one']}) 
df['group'] = [None]*len(df) 
i = 1 
while True: 
    value = df[df['group'].isnull()].iloc[0, 0] 
    g1 = df[df['A']==value] 
    df['group']=np.where(df['A'].isin(g1['A'])|df['B'].isin(g1['B']),i,df['group']) 
    if not any(df['group'].isnull()): 
    break 
    i += 1 
print(df) 

的resule这样

  A  B group 
0 foo one  1 
1 bae one  1 
2 foo two  1 
3 bar two  1 
4 fuz three  2 
5 baz three  2 
6 fzz four  3 
7 coo one  1 

希望对您有所帮助