在分组DataFrame上应用不同聚合的最佳方法

时间:2017-04-12 12:23:48

标签: python pandas

假设我按A

对我的DataFrame key进行分组
 A = pd.DataFrame({    'key':['II','I','I','III','II'],
                       'Z':['a', 'b', 'c', 'd', 'e'],
                       'd':[1,2,0,2,0],
                       'e':[0,2,0,3,0],
                       'f':[0,3,0,4,0],})

我希望每列都有不同聚合。例如:

    {li> sum() f {li> max() e {li> mean() d
  • Z(ae,bc,d)
  • 的串联

由于我无法从DataFrameGroupedBy中分离提取列,因此我必须将A拆分为4个不同的DataFrame,其中列[key, c][key, d][key, e],{在[key, f]之前{1}},将不同的agregations应用于每个,然后按groupby合并。

这看起来有点荒谬,需要很多代码。有更优雅的方式吗?

3 个答案:

答案 0 :(得分:5)

您可以使用dict df = A.groupby('key').agg({'f':'sum','e':'max','d':'mean', 'Z': ''.join}) print (df) d Z f e key I 1.0 bc 3 2 II 0.5 ae 0 0 III 2.0 d 4 3 列和聚合函数:

MaterialBetterSpinner

答案 1 :(得分:3)

您还可以使用agg和传递的字典命名列。

f = dict(
    f={'Sum of f': 'sum'},
    e={'Max of e': 'max'},
    d={'Mean of d': 'mean'},
    Z={'Concat of Z': 'sum'},
)

A.groupby('key').agg(f)

           f        e         d           Z
    Sum of f Max of e Mean of d Concat of Z
key                                        
I          3        2       1.0          bc
II         0        0       0.5          ae
III        4        3       2.0           d

但是,如果您不想pd.MultiIndex它可能更容易使用rename

f = dict(
    f='sum',
    e='max',
    d='mean',
    Z='sum',
)
m = dict(
    f='Sum of f',
    e='Max of e',
    d='Mean of d',
    Z='Concat of Z'
)

A.groupby('key').agg(f).rename(columns=m)

     Sum of f  Max of e  Mean of d Concat of Z
key                                           
I           3         2        1.0          bc
II          0         0        0.5          ae
III         4         3        2.0           d

答案 2 :(得分:1)

或者,如果您想要关键组中列的所有基本统计信息。

A.groupby('key').describe()