按两列分组并计算 Pandas 中每个组合的出现次数

Posted

技术标签:

【中文标题】按两列分组并计算 Pandas 中每个组合的出现次数【英文标题】:Group by two columns and count the occurrences of each combination in Pandas 【发布时间】:2016-12-20 08:37:50 【问题描述】:

我有以下数据框:

data = pd.DataFrame('user_id' : ['a1', 'a1', 'a1', 'a2','a2','a2','a3','a3','a3'], 'product_id' : ['p1','p1','p2','p1','p1','p1','p2','p2','p3'])

product_id  user_id
    p1       a1
    p1       a1
    p2       a1
    p1       a2
    p1       a2
    p1       a2
    p2       a3
    p2       a3
    p3       a3

在实际情况下可能还有其他一些列,但我需要做的是按 product_id 和 user_id 列按数据框分组,并计算每个组合的数量并将其作为新列添加到新的 dat 框架中

输出应该是这样的:

user_id product_id  count
a1       p1            2
a1       p2            1
a2       p1            3
a3       p2            2
a3       p3            1

我已经尝试了以下代码:

grouped=data.groupby(['user_id','product_id']).count()

但结果是:

user_id product_id
 a1       p1
          p2
 a2       p1
 a3       p2
          p3

实际上对我来说最重要的是有一个包含出现次数的列名计数,我需要稍后使用该列。

【问题讨论】:

Python: get a frequency count based on two columns (variables) in pandas dataframe的可能重复 【参考方案1】:

也许这就是你想要的?

>>> data = pd.DataFrame('user_id' : ['a1', 'a1', 'a1', 'a2','a2','a2','a3','a3','a3'], 'product_id' : ['p1','p1','p2','p1','p1','p1','p2','p2','p3'])
>>> count_series = data.groupby(['user_id', 'product_id']).size()
>>> count_series
user_id  product_id
a1       p1            2
         p2            1
a2       p1            3
a3       p2            2
         p3            1
dtype: int64
>>> new_df = count_series.to_frame(name = 'size').reset_index()
>>> new_df
  user_id product_id  size
0      a1         p1     2
1      a1         p2     1
2      a2         p1     3
3      a3         p2     2
4      a3         p3     1
>>> new_df['size']
0    2
1    1
2    3
3    2
4    1
Name: size, dtype: int64

【讨论】:

是的,非常接近,但是我怎样才能将它们放在一个新的数据框中,尤其是那些大小数字作为列名,例如“大小”? 实际上我有 R 背景,使用 dplyr summaries 和 count() 可以轻松完成此任务【参考方案2】:

Pandas 1.1.0 中,您可以将方法 value_counts 与 DataFrames 一起使用:

df.value_counts()

输出:

product_id  user_id
p1          a2         3
p2          a3         2
p1          a1         2
p3          a3         1
p2          a1         1

如果你需要一个 DataFrame:

df.value_counts().to_frame('counts').reset_index()

输出:

  product_id user_id  counts
0         p1      a2       3
1         p2      a3       2
2         p1      a1       2
3         p3      a3       1
4         p2      a1       1

【讨论】:

【参考方案3】:

如果您想创建另一个合并结果的列,请在 @Nehal 的回复上做一点:

您可以组合 product_id 和 size 列:

new_df['combo'] = new_df['product_id'].map(str) + '(' + new_df['size'].map(str) +')'

...然后再次使用 groupby 按 'user_id' 组织该列

new_df['combo'].astype(str).groupby(new_df['userid']).agg(['size',', '.join])

【讨论】:

以上是关于按两列分组并计算 Pandas 中每个组合的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 数据框:按两列分组,然后对另一列进行平均

按两列分组并根据其中一列计算累积值

将熊猫数据框按两列分组而不汇总

按两列排序,为啥不先分组呢?

DataFrame groupby 2列并计算第三次出现

按两列分组并获得第三列的最大值