我对在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
谢谢,我知道这很简单,我只是错过了正确的关键字来找到有人这样做的例子。
答案 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