按两列分组并计算 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 中每个组合的出现次数的主要内容,如果未能解决你的问题,请参考以下文章