簡體   English   中英

獲取pandas數據幀中所有唯一行的計數

[英]Get count of all unique rows in pandas dataframe

我有一個Pandas DataFrame -

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

然后最后我怎么能把它轉換成一個numpy數組,如 -

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

請給出一個與之一致的解決方案

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

您可以使用groupby 大小然后取消堆棧

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后跟一個unstack,你都應該考慮: 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

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

您可以在A和B列上使用groupby ,然后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]])

假設您的所有數據都是二進制的,您只需對列進行求和即可。 為安全起見,您可以使用count來獲取列中所有非空值的總和(此計數與前一個總和之間的差值是零的數量)。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM