首页 > 解决方案 > 按两列分组数据并使用 pandas 进行计数

问题描述

我有以下数据。

  1. 歌曲
  2. play_event

歌曲数据如下:

song_id  total_plays
1        2000
2        4532
3        9999
4        2343

在比赛中,数据如下:

user_id song_id
102         1
103         4
102         1
102         3
104         2
102         1

每次播放一首歌曲,都会有一个新条目,甚至是再次播放一首歌曲。

有了这些数据,我想:

  1. 得到总数。每个用户播放每首歌曲的时间。例如,如果 user_id102播放,song_id 13 次,根据上面的数据。我想让它按 user_id 和总数分组。如下所示:

    user_id  song_id  count
    102      1        3
    102      3        1
    103      4        1
    104      2        1
    

我正在考虑使用熊猫来做到这一点。但我想知道 pandas 是否是正确的选择。

如果它不是熊猫,那么我的前进方向应该是什么。

如果 Pandas 是正确的选择,那么:

下面的代码允许我获取按用户分组或按 user_id 分组的计数我们如何获得按 user_id 和 song_id 分组的计数?请参阅我在下面尝试的示例代码:

import pandas as pd

#Load data from csv file
data = pd.DataFrame.from_csv('play_events.csv')

# Gives how many entries per user
data['user_id'].value_counts()

# Gives how many entries per songs
data['song_id'].value_counts()

标签: pythonpandasgroup-byaggregate

解决方案


对于你的第一个问题,一个简单的 groupbyvalue_counts就可以了。请注意,value_counts()下面代码中的所有内容只是为了将其转换为与所需输出格式相同的实际数据帧。

counts = play_events.groupby('user_id')['song_id'].value_counts().to_frame('count').reset_index()

>>> counts
   user_id  song_id  count
0      102        1      3
1      102        3      1
2      103        4      1
3      104        2      1

然后对于您的第二个问题(您已在编辑的帖子中删除,但我会留下以防万一它对您有用),您可以循环遍历counts,分组user_id,并将每个问题保存为 csv:

for user, data in counts.groupby('user_id', as_index=False):
    data.to_csv(str(user)+'_events.csv')

对于您的示例数据框,这为您提供了 3 个csv102_events.csv103_events.csv103_events.csv。第一个看起来像:

   user_id  song_id  count
0      102        1      3
1      102        3      1

推荐阅读