繁体   English   中英

在 pandas dataframe 中聚合和分组三列

[英]aggregate and group three columns in pandas dataframe

我的 dataframe 是

df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B', 'C', 'C', 'A', 'A'],
                   'col2': ['action1', 'action2', 'action1', 'action3', 'action2', 'action1', 'action1', 'action2'],
                   'col3': ['X', 'X', 'X', 'X', 'X', 'X', 'Y', 'Y']})

看起来像

    col1    col2    col3
0   A       action1 X
1   A       action2 X
2   B       action1 X
3   B       action3 X
4   C       action2 X
5   C       action1 X
6   A       action1 Y
7   A       action2 Y

我想将它们聚合成

    col1    col2            col3
0   A,C     action1,action2 X
1   B       action1,action3 X
2   A       action1,action2 Y

列内的项目顺序无关紧要。 基本上我想聚合 col1 和 col2。 但如果 col3 不同,请区分聚合。

我应该采取什么方法?

可能有很多方法可以做到这一点,但这里有一个使用 groupby 两次的解决方案。 一次构建第一组动作,然后对动作和 col3 进行分组。

df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B', 'C', 'C', 'A', 'A'],
                   'col2': ['action1', 'action2', 'action1', 'action3', 'action2', 'action1', 'action1', 'action2'],
                   'col3': ['X', 'X', 'X', 'X', 'X', 'X', 'Y', 'Y']})

df = df.sort_values(by='col2')
df = df.groupby(['col3','col1'], as_index=False)['col2'].apply(lambda x: ','.join(x))
df = df.groupby(['col3','col2'], as_index=False)['col1'].apply(lambda x: ','.join(x)).sort_index(axis=1)

Output

  col1             col2 col3
0  A,C  action1,action2    X
1    B  action1,action3    X
2    A  action1,action2    Y

IIUC,您想对 col2 中具有共同值的组进行分组。

为此,您需要设置一个助手组:

m = df.groupby('col1')['col2'].apply(frozenset)

(df.groupby([df['col1'].map(m), 'col3'], as_index=False)
   .aggregate(lambda x: ','.join(set(x)))
)

output:

  col3 col1             col2
0    X  A,C  action1,action2
1    Y    A  action1,action2
2    X    B  action1,action3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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