按一列分组并在熊猫中找到另一列的总和和最大值
Posted
技术标签:
【中文标题】按一列分组并在熊猫中找到另一列的总和和最大值【英文标题】:Group by one columns and find sum and max value for another in pandas 【发布时间】:2017-11-27 05:07:36 【问题描述】:我有一个这样的数据框:
Name id col1 col2 col3 cl4
PL 252 0 747 3 53
PL2 252 1 24 2 35
PL3 252 4 75 24 13
AD 889 53 24 0 95
AD2 889 23 2 0 13
AD3 889 0 24 3 6
BG 024 12 89 53 66
BG1 024 43 16 13 0
BG2 024 5 32 101 4
现在我需要按 ID 分组,对于 col1 和 col4 列,找到每个 id 的总和,并将其放入父列附近的新列中(例如:col3(sum))但是对于 col2 和 col3,找到 max价值。 期望的输出:
Name id col1 col1(sum) col2 col2(max) col3 col(max) col4 col4(sum)
PL 252 0 5 747 747 3 24 6 18
PL2 252 1 5 24 747 2 24 12 18
PL3 252 4 5 75 747 24 24 0 18
AD 889 53 76 24 24 95 95 23 33
AD2 889 23 76 2 24 13 95 5 33
AD3 889 0 76 24 24 6 95 5 33
BG 024 12 60 89 89 66 66 0 67
BG1 024 43 60 16 89 0 66 63 67
BG2 024 5 60 32 89 4 66 4 67
计算这个最简单、最快的方法是什么?
【问题讨论】:
【参考方案1】:当您的 id 上有 groupby 和 sum 时,您可以使用 merge:
pd.merge(df,df.groupby("id").sum().reset_index(), on='id',how='outer')
输出
【讨论】:
【参考方案2】:您可以使用 groupby/transform 创建所需的列
df[['col1_sum', 'col4_sum']]=df.groupby('id')['col1', 'cl4'].transform('sum')
df[['col2_max', 'col3_max']]=df.groupby('id')['col1', 'cl4'].transform('max')
Name id col1 col2 col3 cl4 col1_sum col4_sum col2_max col3_max
0 PL 252 0 747 3 53 5 101 4 53
1 PL2 252 1 24 2 35 5 101 4 53
2 PL3 252 4 75 24 13 5 101 4 53
3 AD 889 53 24 0 95 76 114 53 95
4 AD2 889 23 2 0 13 76 114 53 95
5 AD3 889 0 24 3 6 76 114 53 95
6 BG 24 12 89 53 66 60 70 43 66
7 BG1 24 43 16 13 0 60 70 43 66
8 BG2 24 5 32 101 4 60 70 43 66
【讨论】:
【参考方案3】:我知道这很麻烦,但我喜欢链接,所以你可以这样做:
df = df.groupby('id').
apply(lambda g: g.assign(
col1_sum=g.col1.sum(),
col2_max=g.col2.max()))
基本上,这是对每个组应用基于组的分配命令,然后组合成单个 DataFrame。
有关每种方法的详细信息,请参阅https://pandas.pydata.org/pandas-docs/stable/api.html。
【讨论】:
【参考方案4】:执行此操作的最(熊猫)原生方式是使用.agg()
方法,该方法允许您指定要对每列应用的聚合函数(就像在 SQL 中所做的那样)。
文档示例:
df.groupby('A').agg('B': ['min', 'max'], 'C': 'sum')
【讨论】:
以上是关于按一列分组并在熊猫中找到另一列的总和和最大值的主要内容,如果未能解决你的问题,请参考以下文章