2015-05-18 53 views
2

我想用第三列來加權熊貓交叉表的結果。在pandas crosstab中加權的結果

例如,以下內容:

import pandas as pd 
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'bar'], 
        'B': [1, 1, 0, 0, 0], 
        'weight': [2, 3, 4, 5, 6]}) 
print(pd.crosstab(df.A, df.B)) 

結果:

B 0 1 
A   
bar 2 1 
foo 1 1 

我想結果是什麼:

B  0 1 
A   
bar 11 3 
foo 4 2 
+0

如何https://stackoverflow.com/questions/47059124/pandas-crosstab-how-to-calculate-weighted平行和如何添加行和colu? –

回答

3

您可以使用aggfunc參數提供自定義聚合函數交叉表:

pd.crosstab(df.A, df.B, df.weight, aggfunc = sum) 
B  0 1 
A   
bar 11 3 
foo 4 2 
+0

非常好,比我的回答好得多,特別是如果你的數據幀很大。 – JohnE

1

這實在是浪費內存和只有當權重可以被解釋爲頻率(即權重是整數)時纔有效,但這樣做相當簡單:

df2 = df.iloc[ np.repeat(df.index.values, df.weight) ] 

這只是採用先進/看中索引,以擴大比例行權:

 A B weight 
0 foo 1  2 
0 foo 1  2 
1 bar 1  3 
1 bar 1  3 
1 bar 1  3 

然後就可以正常運行交叉表:

pd.crosstab(df2.A, df2.B) 

B  0 1 
A   
bar 11 3 
foo 4 2 

我懷疑這是必要的編寫一個自定義版本的交叉表,以便正確有效地處理權重,因爲熊貓中很少(如果有)函數自動爲你加權。這不會很難,也許別人會這樣做的答案。

可能scipy或statsmodels有一個自動的方式來做到這一點?