2017-04-11 64 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 

希望對您有所幫助