熊猫,得到卑鄙和与groupby的总和

时间:2016-05-20 08:29:19

标签: pandas

我有一个数据框df,如下所示:

index  New  Old  Map      Limit  count
1       93   35   54       > 18      1
2      163   93  116       > 18      1
3      134   78   96       > 18      1
4      117   81   93       > 18      1
5      194  108  136       > 18      1
6      125   57   79      <= 18      1
7       66   39   48       > 18      1
8      120   83   95       > 18      1
9      150   98  115       > 18      1
10     149   99  115       > 18      1
11     148   85  106       > 18      1
12      92   55   67      <= 18      1
13      64   24   37       > 18      1
14      84   53   63       > 18      1
15      99   70   79       > 18      1

我需要生成一个如下所示的数据框:

Limit        <=18             >18
         total  mean     total  mean
New       xx1    yy1      aa1    bb1
Old       xx2    yy2      aa2    bb2
MAP       xx3    yy3      aa3    bb3

我尝试了这个没有成功:

df.groupby('Limit')['New', 'Old', 'MAP'].[sum(), mean()].T without success.

我怎样才能在熊猫中实现这一目标?

1 个答案:

答案 0 :(得分:1)

您可以将groupbyagg一起使用,然后按Tunstack进行转置:

print (df[['New', 'Old', 'Map', 'Limit']].groupby('Limit').agg([sum, 'mean']).T.unstack())

Limit  <= 18           > 18            
         sum   mean     sum        mean
New    217.0  108.5  1581.0  121.615385
Old    112.0   56.0   946.0   72.769231
Map    146.0   73.0  1153.0   88.692308

我按comment进行编辑,看起来更好:

print (df.groupby('Limit')['New', 'Old', 'Map', 'Limit'].agg([sum, 'mean']).T.unstack())

如果需要total列:

print (df.groupby('Limit')['New', 'Old', 'Map', 'Limit']
         .agg({'total':sum, 'mean': 'mean'})
         .T
         .unstack(0))

Limit  <= 18           > 18            
       total   mean   total        mean
New    217.0  108.5  1581.0  121.615385
Old    112.0   56.0   946.0   72.769231
Map    146.0   73.0  1153.0   88.692308