python - 按两列分组数据并使用 pandas 进行计数
问题描述
我有以下数据。
- 歌曲
- 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
每次播放一首歌曲,都会有一个新条目,甚至是再次播放一首歌曲。
有了这些数据,我想:
得到总数。每个用户播放每首歌曲的时间。例如,如果 user_id
102
播放,song_id1
3 次,根据上面的数据。我想让它按 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()
解决方案
对于你的第一个问题,一个简单的 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 个csv
:102_events.csv
、103_events.csv
和103_events.csv
。第一个看起来像:
user_id song_id count
0 102 1 3
1 102 3 1
推荐阅读
- c++ - 我们不能多次使用删除运算符吗?
- spring-boot - 通过 Spring Oauth2 Auth Server 中的用户权限减少范围
- javascript - (ajax, jquery) 自动完成在 chrome 中有效,但在 opera 中无效
- codeigniter - 类型:参数计数错误
- node.js - 托管 npm run build (Nuxt) 并将其放在托管显示文件夹列表
- windows - 用于传入流量的 PC 端口路由/代理?
- scala - Scala 编译错误:未找到:类型 _$1
- python - 对 Hailstone 序列进行编码,打印任意正整数范围或输入数字的序列
- r - 管道工端点中的模型创建/加载
- android-studio - 我可以使用带有 MobileNet 或 Deeplab 图像分割模型的 Camerax 从相机进行实时图像分割吗?