pandas group by,在输入列上使用多个 agg 函数进行聚合

All*_*ang 4 python r pandas

我希望对 pandas groupby 数据框进行一些聚合,其中我需要在多个列上应用多个不同的自定义函数。此操作在 R 中非常简单且常见(使用data.tabledplyr),但令我惊讶的是我发现它在 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)

我想计算统计量,但也想计算每组中的样本大小,这看起来应该是一两行解决方案,但有时我还需要在分组数据框的多个列上应用多个函数。

All*_*len 5

如果你需要单行,你可以这样做:

#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)