我希望对 pandas groupby 数据框进行一些聚合,其中我需要在多个列上应用多个不同的自定义函数。此操作在 R 中非常简单且常见(使用data.table或dplyr),但令我惊讶的是我发现它在 pandas 中如此困难:
import pandas as pd
data = pd.DataFrame({'A':[1,2,3,4,5,6],'B':[2,4,6,8,10,12],'C':[1,1,1,2,2,2]})
#These work
data.groupby('C').apply(lambda x: x.A.mean() - x.B.mean())
data.groupby('C').agg(['mean','std'])
#but this doesn't
data.groupby('C').agg([lambda x: x.A.mean() - x.B.mean(),
lambda x: len(x.A)])
Run Code Online (Sandbox Code Playgroud)
我想计算统计量,但也想计算每组中的样本大小,这看起来应该是一两行解决方案,但有时我还需要在分组数据框的多个列上应用多个函数。
如果你需要单行,你可以这样做:
#use apply instead of agg to create multiple columns
data.groupby('C').apply(lambda x: pd.Series([x.A.mean() - x.B.mean(), len(x.A)])).rename(columns={0:'diff',1:'a_len'})
Out[2346]:
diff a_len
C
1 -2.0 3.0
2 -5.0 3.0
Run Code Online (Sandbox Code Playgroud)
另一种不使用重命名的解决方案。
data.groupby('C').apply(lambda x: pd.DataFrame([[x.A.mean() - x.B.mean(), len(x.A)]],columns=['diff','a_len']))
Out[24]:
diff a_len
C
1 0 -2.0 3
2 0 -5.0 3
Run Code Online (Sandbox Code Playgroud)