熊猫,分组和计数

Posted

技术标签:

【中文标题】熊猫,分组和计数【英文标题】:Pandas, groupby and count 【发布时间】:2018-04-29 10:55:25 【问题描述】:

我有一个这样的数据框

>>> df = pd.DataFrame('user_id':['a','a','s','s','s'],
                    'session':[4,5,4,5,5],
                    'revenue':[-1,0,1,2,1])

>>> df
   revenue  session user_id
0       -1        4       a
1        0        5       a
2        1        4       s
3        2        5       s
4        1        5       s

而session和receiver的每一个值都代表一种类型,我想统计每种类型的个数,比如user_id=arevenue=-1session=4的个数是1。

我发现groupby()之后的简单调用count()函数无法输出我想要的结果。

>>> df.groupby('user_id').count()
         revenue  session
user_id
a              2        2
s              3        3

我该怎么做?

【问题讨论】:

从 pandas 1.1 这可以通过df.value_counts 实现,让您避免分组步骤。 【参考方案1】:

您似乎想一次按几列分组:

df.groupby(['revenue','session','user_id'])['user_id'].count()

应该给你你想要的

【讨论】:

【参考方案2】:

pandas >= 1.1:df.value_counts 可用!

从 pandas 1.1 开始,这将是我推荐的计算组中行数(即组大小)的方法。要计算组中的非 nan 行数特定列,请查看accepted answer。

df.groupby(['A', 'B']).size()   # df.groupby(['A', 'B'])['C'].count()

[✓]

df.value_counts(subset=['A', 'B']) 

注意sizecount 不相同,前者计算每组的所有行,后者仅计算非空行。请参阅this other answer of mine 了解更多信息。


小例子

pd.__version__
# '1.1.0.dev0+2004.g8d10bfb6f'

df = pd.DataFrame('num_legs': [2, 4, 4, 6],
                   'num_wings': [2, 0, 0, 0],
                  index=['falcon', 'dog', 'cat', 'ant'])
df
        num_legs  num_wings
falcon         2          2
dog            4          0
cat            4          0
ant            6          0
df.value_counts(subset=['num_legs', 'num_wings'], sort=False)

num_legs  num_wings
2         2            1
4         0            2
6         0            1
dtype: int64

将此输出与

进行比较
df.groupby(['num_legs', 'num_wings'])['num_legs'].size()

num_legs  num_wings
2         2            1
4         0            2
6         0            1
Name: num_legs, dtype: int64

性能

如果不对结果进行排序也会更快:

%timeit df.groupby(['num_legs', 'num_wings'])['num_legs'].count()
%timeit df.value_counts(subset=['num_legs', 'num_wings'], sort=False)

640 µs ± 28.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
568 µs ± 6.88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

【讨论】:

当我将subsetvalue_counts 一起使用并进行打印时,我会丢失列标题;知道为什么会这样吗? 与@FMFF 有同样的问题。我失去了我分组的列。相反,它们以“columnA/columnB”的形式充当索引 @petzholt 使用as_index=False 作为groupby 的参数怎么样?【参考方案3】:

我在同样的问题上苦苦挣扎,使用了上面提供的解决方案。您实际上可以指定要计算的任何列:

df.groupby(['revenue','session','user_id'])['revenue'].count()

df.groupby(['revenue','session','user_id'])['session'].count()

会给出相同的答案。

【讨论】:

只有当所有列都包含相同数量的非 NA 值时才适用。 这个答案不正确,您不能为“count”指定 any 列,因为 count() 只计算非空值,而不同的列可以有不同的 nan 计数。如果您要计算每个组中的行数,请改用df.value_counts(subset=['...])(请参阅here)。

以上是关于熊猫,分组和计数的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框列的分组和计数

在熊猫数据框中按日期和计数值分组

熊猫计数分组值[重复]

当日期不唯一时,在熊猫中按日期分组后计数观察值

按连续计数 Pandas Python 分组 [关闭]

如何按列值的计数进行分组并对其进行排序?