在组件之后过滤时,在Pandas中汇总分组数据

时间:2014-02-28 16:25:00

标签: python pandas

我对在Pandas中分组和聚合某些数据的确切(或至少是最优雅)步骤感到磕磕绊绊。假设我有一个看起来像这样的DataFrame -

system    sub_system     datatype     datacount
a         1              foo          111
a         1              bar          222
a         1              baz          333
a         2              foo          444
a         2              baz          555
b         1              foo          667
b         3              baz          777

我希望在按系统和子系统分组时得到数据量的总和,只要数据类型不等于bar,然后将这些总数放回原始数据帧中。

如果我尝试non_bar_totals = df [df.datatype!='bar']。groupby(['system','sub_sytem'])。agg(np.sum),它会给我一些像 -

                        count
system    sub_system
a         1             444
a         2             999
b         1             667
b         3             777

但现在我不确定如何将该计数值推回到原始DataFrame中。将这些计数推回原始Dataframe的正确语法是什么?最终产品应该看起来像 -

system    sub_system     datatype     datacount    non_bar_total
a         1              foo          111          444
a         1              bar          222          444
a         1              baz          333          444
a         2              foo          444          999
a         2              baz          555          999
b         1              foo          667          667
b         3              baz          777          777

谢谢,我知道这很简单,我只是错过了正确的关键字来找到有人这样做的例子。

1 个答案:

答案 0 :(得分:0)

你可以使用应用功能的力量:

def conditional_sum(grp):
    grp['non_bar_total'] = grp[grp.datatype != 'bar']['datacount'].sum()
    return grp

df.groupby(['system', 'sub_system']).apply(conditional_sum)

system  sub_system  datatype    datacount   non_bar_total
0    a   1   foo     111     444
1    a   1   bar     222     444
2    a   1   baz     333     444
3    a   2   foo     444     999
4    a   2   baz     555     999
5    b   1   foo     667     667
6    b   3   baz     777     777