2015-12-13 10 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 

今、私が最もある何

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

のみの列の行の数を取得するためにこれを使用します

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

そして最終的には時間 - つまり、次のような出力列AとBの行数を取得するための効率的な方法OW、私のようなnumpyの配列に変換することができます - あなたはAとB列にgroupbyを使用し、その後にcountを行うことも

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

[this](http://stackoverflow.com/tour)は、このサイトで動作します。 – jezrael

答えて

7

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

と一致している解決策を教えてください

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

結果。しかし、それで元のデータフレームにある値だけが得られます。あなたの場合、0 0カウントはありません。

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方法を使用できます:その後、あなたはnumpy配列を取得するためにvaluesメソッドを呼び出すことができ

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を使用して、列内のすべての非NULL値の合計を取得します(この数と前の合計の差はゼロの数です)。

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

ヌル値がないと確信できる場合は、最初のシェイプパラメータから行数を取得するだけで計算時間を節約できます。

あなたが sizeをGROUPBY使用し、 unstackでき
>>> np.matrix([s, data.shape[0] - s]) 
matrix([[3, 3], 
     [2, 2]] 
関連する問題