2014-02-28 25 views
0

我正在絆倒精確(或至少最優雅的)步驟來分組和聚合Pandas中的一些數據。比方說,我有一個數據幀,看起來是這樣的 -在Pandas中總結分組數據,同時在羣組部分之後進行過濾

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 

我想獲得DATACOUNT的總和,同時通過系統和sub_system分組,只要數據類型不等於欄,然後把那些總計回原始數據框。

如果我嘗試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中。什麼是正確的語法讓這些計數被推回原始的數據框?最終產品應該像 -

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

感覺就像是你應該能夠使用轉換像'g.transform(拉姆達X:X [「DATACOUNT」]其中(x ['datatype']!='bar')。sum())'但不完全。 –

回答

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 
+0

棒極了!感謝您的快速和簡單的答案! – Kafonek

相關問題