在pandas数据框中获取所有唯一行的数量

9

我是一个 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'])

你可以将这个链接看作是了解该网站的指南。 - jezrael
3个回答

10

你可以使用 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操作后跟着一个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

这将是最高效的解决方案,同时也是最直接的。


2
您可以在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]])

但我不能保证所有行都存在。我也必须考虑到这种情况。 - Yashu Seth

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接