繁体   English   中英

熊猫-基于两列中的值进行分组

[英]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也是onetwo =>。

A列中的onetwo的关联值也是group1中的foobarcoo =>。

相同的原则给我们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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM