按两列对数据进行分组,并使用pandas对其进行计数

时间:2018-10-11 19:39:40

标签: python pandas group-by aggregate

我有以下数据。

  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_id 102,则song_id 1会播放三遍。我想按总计数将其按user_id分组。如下所示:

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

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

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

如果熊猫是正确的选择,则:

以下代码允许我获取按用户分组或按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()

1 个答案:

答案 0 :(得分:1)

对于第一个问题,一个简单的groupby和value_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