[英]pandas - group based on values from two columns
我有这个数据框:
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
开始。所有foo
都将在group1
。 B中的关联值在group1
也是one
和two
=>。
A列中的one
和two
的关联值也是group1
中的foo
, bar
和coo
=>。
相同的原则给我们group2
。
最好的方法是什么?
可能这就是您想要的东西,它有点硬编码,但具有所需的输出:
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)
除了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)
像这样的结果
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
希望对你有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.