[英]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'])
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.