2016-08-23 18 views
1

這裏是定義如下一個大熊貓數據幀:如何做一些像pandas中的groupby()和value_counts()這樣的操作?

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo', 'foo'], 
        'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three', 'two'], 
        'C' : [0, 1, 0, 1, 1, 2, 0, 2, 1]}) 
>>> df 
    A  B C 
0 foo one 0 
1 bar one 1 
2 foo two 0 
3 bar three 1 
4 foo two 1 
5 bar two 2 
6 foo one 0 
7 foo three 2 
8 foo two 1 

我想要做兩次手術。

首先,按列AB將數據幀分組。因此,在這種情況下獲得6個組。此操作與pandas中的groupby()函數類似。

然後,對於每個組,執行列C的計數操作,因爲在這種情況下它可以是三個不同的值(0,1和2)。此操作與pandas中的value_counts()函數類似。

最後,我想要一個像這樣的新數據框。

 A  B C_value0 C_value1 C_value2 
0 foo one   2   0   0 
1 foo two   1   2   0 
2 foo three   0   0   1 
3 bar one   0   1   0 
4 bar two   0   0   1 
5 bar three   0   1   0 

有人能告訴我如何做到這一點嗎?謝謝!

回答

1

您可以使用groupby與聚集size,然後通過fillna更換NaN0,(在pandas0.18.0新)轉換爲intastypeadd_prefixreset_index和最後rename_axis

print (df.groupby(['A','B', 'C'])['C'].size() 
             .unstack() 
             .fillna(0) 
             .astype(int) 
             .add_prefix('C_value') 
             .reset_index() 
             .rename_axis(None, axis=1)) 

    A  B C_value0 C_value1 C_value2 
0 bar one   0   1   0 
1 bar three   0   1   0 
2 bar two   0   0   1 
3 foo one   2   0   0 
4 foo three   0   0   1 
5 foo two   1   2   0 

crosstab另一種解決方案:

print (pd.crosstab([df.A, df.B], df.C) 
     .add_prefix('C_value') 
     .reset_index() 
     .rename_axis(None, axis=1)) 

    A  B C_value0 C_value1 C_value2 
0 bar one   0   1   0 
1 bar three   0   1   0 
2 bar two   0   0   1 
3 foo one   2   0   0 
4 foo three   0   0   1 
5 foo two   1   2   0 
+0

很好的解決方案!非常感謝你! – o0Helloworld0o

+0

很高興能爲您提供幫助。請不要忘記[接受](http://meta.stackexchange.com/a/5235/295067)它。謝謝。 – jezrael

+0

當我運行你的代碼時,出現了一個錯誤。該錯誤說「TypeError:必須通過索引來重命名」。然後我刪除「.rename_axis(None,axis = 1)」,它可以成功運行。 – o0Helloworld0o