2015-12-13 93 views
6

我有一個熊貓數據幀的獲取計數 -在大熊貓數據幀的所有獨特的行

>>> import numpy as np 
>>> import pandas as pd 
>>> data = pd.DataFrame(np.random.randint(low=0, high=2,size=(5,3)), 
...      columns=['A', 'B', 'C']) 
>>> data 
    A B C 
0 0 1 0 
1 1 0 1 
2 1 0 1 
3 0 1 1 
4 1 1 0 

現在我用這個來獲得的行數僅列A

>>> data.ix[:, 'A'].value_counts() 
1 3 
0 2 
dtype: int64 

什麼是最有效的方法來獲得A列和B列的行數,即類似於下面的輸出 -

0 0 0 
0 1 2 
1 0 2 
1 1 1 

然後最後h嗷嗷我可以把它轉換成numpy的陣列,例如 -

array([[0, 2], 
     [2, 1]]) 

請給出一個解決方案,還與

>>>> data = pd.DataFrame(np.random.randint(low=0, high=2,size=(5,2)), 
...      columns=['A', 'B']) 
+0

您可以閱讀[this](http://stackoverflow.com/tour)作爲本網站的作品。 – jezrael

回答

7

您可以使用GROUPBY size然後unstack

In [11]: data.groupby(["A","B"]).size() 
Out[11]: 
A B 
0 1 2 
1 0 2 
    1 1 
dtype: int64 

In [12]: data.groupby(["A","B"]).size().unstack("B") 
Out[12]: 
B 0 1 
A 
0 NaN 2 
1 2 1 

In [13]: data.groupby(["A","B"]).size().unstack("B").fillna(0) 
Out[13]: 
B 0 1 
A 
0 0 2 
1 2 1 

但是只要你做一個GROUPBY接着拆散你應該想:pivot_table

In [21]: data.pivot_table(index="A", columns="B", aggfunc="count", fill_value=0) 
Out[21]: 
    C 
B 0 1 
A 
0 0 2 
1 2 1 

這將是最有效的解決方案,也是最直接的解決方案。

0

一致,您可以在一個使用groupby和B柱,然後做count上結果。但是通過這種方式,您將只能獲得原始數據框中的值。在你的情況下,你將不會有0 0計數。之後,你可以調用values方法來獲取numpy陣列:

In [52]: df 
Out[52]: 
    A B C 
0 0 1 0 
1 1 0 1 
2 1 0 1 
3 0 1 1 
4 1 1 0 

In [56]: df.groupby(['A', 'B'], as_index=False).count() 
Out[56]: 
    A B C 
0 0 1 2 
1 1 0 2 
2 1 1 1 

In [57]: df.groupby(['A', 'B'], as_index=False).count().C.values 
Out[57]: array([2, 2, 1]) 

那麼你可以使用numpy的陣列

reshape方法對數據幀的所有值:

In [71]: df 
Out[71]: 
    A B C 
0 1 0 1 
1 1 1 1 
2 1 0 1 
3 1 1 0 
4 0 1 1 
5 0 0 1 
6 1 1 1 
7 0 0 1 
8 0 1 0 
9 1 1 0 

In [73]: df.groupby(['A', 'B'], as_index=False).count() 
Out[73]: 
    A B C 
0 0 0 2 
1 0 1 2 
2 1 0 2 
3 1 1 4 


In [75]: df.groupby(['A', 'B'], as_index=False).count().C.values.reshape(2,2) 
Out[75]: 
array([[2, 2], 
     [2, 4]]) 
+0

但我不能總是確保所有的行都會出現。我也必須解決這個問題。 –

0

假設所有的數據是二進制的,你可以對列進行求和。爲了安全起見,您可以使用count來獲得列中所有非空值的總和(此計數與以前的總和之間的差值爲零的數量)。

s = data[['A', 'B']].sum().values 
>>> np.matrix([s, data[['A', 'B']].count().values - s]) 
matrix([[3, 3], 
     [2, 2]] 

如果您確定沒有空值,您可以通過從第一個形狀參數中獲取行數來節省一些計算時間。

>>> np.matrix([s, data.shape[0] - s]) 
matrix([[3, 3], 
     [2, 2]]