如何使用 grouby 应用涉及 pandas 数据框多列的多个函数?

How can I apply multiple functions involving multiple columns of a pandas dataframe with grouby?

考虑以下数据:

id cat date max score
1 s1 A 12/06 9 5.4
2 s1 B 12/06 10 5.4
3 s2 C 11/04 13 4.2
4 s2 D 11/04 28 10
5 s3 E 08/02 16 5.4
5 s3 F 08/02 6 5.4

我想按“id”分组并获得第一列 [cat, date] 但同时我想获得 max - score 列的平均值。 我认为这可以通过聚合来完成:

但是对于聚合我无法访问数据框的所有列。

id cat date mean(max-score)
s1 A 12/06 4.1
s2 C 11/04 13.4
s3 E 08/02 5.6

你首先需要将max-score赋值给mean(max-score),然后这是一个简单的groupby+agg:

(df.assign(**{'mean(max-score)': df['max']-df['score']})
   .groupby('id', as_index=False)
   .agg({'cat': 'first', 'date': 'first', 'mean(max-score)': 'mean'})
)

输出:

   id cat   date  mean(max-score)
0  s1   A  12/06              4.1
1  s2   C  11/04             13.4
2  s3   E  08/02              5.6

从pandas0.25开始,还可以使用pd.namedAgg,一个很好用的功能:

df['diff'] = df['max'] - df['score']
df.groupby('id').agg(cat=pd.NamedAgg(columns='cat',aggfunc='first'),
                         date=pd.NamedAgg(columns='date',aggfunc='first'),
                         mean(max-score)=pd.NamedAgg(columns='diff',aggfunc='mean'))