In [2]: df
Out[2]:
col1 col2 col3 col4 col5 col6
0 A B 0.20 -0.61 -0.49 1.49
1 A B -1.53 -1.01 -0.39 1.82
2 A B -0.44 0.27 0.72 0.11
3 A B 0.28 -1.32 0.38 0.18
4 C D 0.12 0.59 0.81 0.66
5 C D -0.13 -1.65 -1.64 0.50
6 C D -1.42 -0.11 -0.18 -0.44
7 E F -0.00 1.42 -0.26 1.17
8 E F 0.91 -0.47 1.35 -0.34
9 G H 1.48 -0.63 -1.14 0.17
首先让我们使用 .size() 来获取行数:
In [3]: df.groupby(['col1', 'col2']).size()
Out[3]:
col1 col2
A B 4
C D 3
E F 2
G H 1
dtype: int64
然后让我们使用 .size().reset_index(name='counts') 来获取行数:
In [4]: df.groupby(['col1', 'col2']).size().reset_index(name='counts')
Out[4]:
col1 col2 counts
0 A B 4
1 C D 3
2 E F 2
3 G H 1
包括更多统计数据的结果
如果要计算分组数据的统计信息,通常如下所示:
In [5]: (df
...: .groupby(['col1', 'col2'])
...: .agg({
...: 'col3': ['mean', 'count'],
...: 'col4': ['median', 'min', 'count']
...: }))
Out[5]:
col4 col3
median min count mean count
col1 col2
A B -0.810 -1.32 4 -0.372500 4
C D -0.110 -1.65 3 -0.476667 3
E F 0.475 -0.47 2 0.455000 2
G H -0.630 -0.63 1 1.480000 1
3 回答
在
groupby
对象上,agg
函数可以立即将列表设置为apply several aggregation methods . 这应该给你你需要的结果:快速解答:
获取每组行数的最简单方法是调用
.size()
,返回Series
:通常你想要这个结果为
DataFrame
(而不是Series
)所以你可以这样做:如果您想了解如何计算每个组的行数和其他统计数据,请继续阅读下面的内容 .
详细示例:
请考虑以下示例数据帧:
首先让我们使用
.size()
来获取行数:然后让我们使用
.size().reset_index(name='counts')
来获取行数:包括更多统计数据的结果
如果要计算分组数据的统计信息,通常如下所示:
由于嵌套列标签,上面的结果有点烦人,也因为行数是基于每列的 .
为了获得对输出的更多控制,我通常将统计数据拆分为单个聚合,然后使用
join
进行组合 . 它看起来像这样:脚注
用于生成测试数据的代码如下所示:
Disclaimer:
如果您聚合的某些列具有空值,那么您确实希望将组行计数视为每列的独立聚合 . 否则,您可能会被误导为实际使用了多少记录来计算平均值,因为大熊猫会在平均计算中删除
NaN
条目,而不会告诉您 .我们可以通过使用groupby和count轻松完成 . 但是,我们应该记得使用reset_index() .