获取pandas数据帧中所有唯一行的计数

时间:2015-12-13 20:20:35

标签: python numpy pandas

我有一个Pandas DataFrame -

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
<link rel="stylesheet" type="text/css" href="stylesheet.css">
<title>Hull Daily News</title>
</head>
<body>

<div>
<img class="webheadlogo" src="logo1.png" alt=".logo">
<img class="webheadimg" src="Webhead.jpg" alt=".Webhead" />

</div>
<div class="body1">
<p class="text">
asdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</p>
</div>
<div id="menu">
<ul>
<li><a href="website.html">Home</a>
<li><a href="breakingnews.html">Breaking News</a></li>
<li><a href="Sport.html">Sport</a></li>
<li><a href="Hulltoday.html">Hull Today</a></li>
<li><a href="Property.html">Property</a></li>
<li><a href="Social.html">Social Media</a></li>
<li><a href="Music.html">Music</a></li>
<li><a href="Reviews.html">Reviews</a></li>
<li><a href="Movies.html">Movies</a></li>
<li><a href="Weather.html">Weather</a></li>
</ul>
</div>

</body>
</html>

现在我用它来获取仅用于A列的行数

>>> 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列和B列的行数最有效的方法是什么,例如以下输出 -

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

然后我最后如何将其转换为numpy数组,如 -

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

请提供与

一致的解决方案
array([[0, 2],
       [2, 1]])

3 个答案:

答案 0 :(得分:9)

您可以使用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

这将是最有效的解决方案,也是最直接的解决方案。

答案 1 :(得分: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]])

答案 2 :(得分:0)

假设您的所有数据都是二进制数据,则可以对列进行求和。为安全起见,您可以使用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]]