如何对一列执行 pandas groupby 操作,但将另一列保留在结果数据框中
Posted
技术标签:
【中文标题】如何对一列执行 pandas groupby 操作,但将另一列保留在结果数据框中【英文标题】:How to do a pandas groupby operation on one column but keep the other in the resulting dataframe 【发布时间】:2017-03-16 18:37:30 【问题描述】:我的问题是关于 pandas 的 groupby 操作。我有以下数据框:
In [4]: df = pd.DataFrame("A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est", "Est", "West", "West"])
In [5]: df
Out[5]:
A B C
0 0 PO Est
1 1 PO Est
2 2 PA West
3 3 PA West
这就是我想做的:我想按 B 列分组并对 A 列求和。但最后,我希望 C 列仍然在 DataFrame 中。如果我这样做:
In [8]: df.groupby(by="B").aggregate(pd.np.sum)
Out[8]:
A
B
PA 5
PO 1
它完成了这项工作,但缺少 C 列。我也可以这样做:
In [9]: df.groupby(by=["B", "C"]).aggregate(pd.np.sum)
Out[9]:
A
B C
PA West 5
PO Est 1
或
In [11]: df.groupby(by=["B", "C"], as_index=False).aggregate(pd.np.sum)
Out[11]:
B C A
0 PA West 5
1 PO Est 1
但在这两种情况下,它都按 B AND C 而不仅仅是 B 分组并保留 C 值。我想做的事无关紧要还是有办法?
【问题讨论】:
【参考方案1】:尝试将DataFrameGroupBy.agg() 方法与dict of column -> function
一起使用:
In [6]: df.groupby('B').agg('A':'sum', 'C':'first')
Out[6]:
C A
B
PA West 5
PO Est 1
来自文档:
用于聚合组的函数。如果是一个函数,必须要么 在传递 DataFrame 或传递给 DataFrame.apply 时工作。如果 传入一个dict,key必须是DataFrame列名。
或类似的东西取决于你的目标:
In [8]: df = pd.DataFrame("A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est1", "Est2", "West1", "West2"])
In [9]: df.groupby('B').agg('A':'sum', 'C':'first')
Out[9]:
C A
B
PA West1 5
PO Est1 1
In [10]: df['sum_A'] = df.groupby('B')['A'].transform('sum')
In [11]: df
Out[11]:
A B C sum_A
0 0 PO Est1 1
1 1 PO Est2 1
2 2 PA West1 5
3 3 PA West2 5
【讨论】:
如果C
值在所有被分组的值上都相同,则此方法有效。否则,merge
就可以完成这项工作。
@Khris,谢谢你的提示!我添加了一个使用.transform()
方法的替代解决方案
太棒了!!非常感谢。
我不熟悉,但也许这个问题可以在 python/pandas wiki 或 *** 文档中结束?
@MaxU:感谢您提醒我transform
函数,到目前为止,我忽略了这一点并解决了繁琐的合并问题。以上是关于如何对一列执行 pandas groupby 操作,但将另一列保留在结果数据框中的主要内容,如果未能解决你的问题,请参考以下文章
如何基于pandas.groupby()。max()中一列的最大值获得整行?