如何在Pandas DataFrame中计算用户歌曲收听频率(推荐系统)
计算用户歌曲收听频率的Pandas实现
核心逻辑
要得到每个用户对单首歌的收听频率,只需两步:
- 按
user_id分组,计算每个用户的总收听次数 - 将总收听次数与原数据合并,用单首歌的
listen_count除以用户总收听次数得到频率
分步代码实现
- 计算用户总收听次数
# 按user_id分组求和,得到每个用户的总收听次数 user_total_listens = df.groupby('user_id')['listen_count'].sum().reset_index(name='total_listens')
- 合并原数据与总收听次数
# 左连接合并,保留原DataFrame的所有行数据 df_with_total = df.merge(user_total_listens, on='user_id', how='left')
- 计算收听频率
# 计算每首歌的收听频率 df_with_total['listen_frequency'] = df_with_total['listen_count'] / df_with_total['total_listens']
边界情况处理(可选)
如果存在用户总收听次数为0的极端情况,可添加判断避免除零错误:
df_with_total['listen_frequency'] = df_with_total.apply( lambda row: row['listen_count'] / row['total_listens'] if row['total_listens'] != 0 else 0, axis=1 )
完整示例
import pandas as pd # 构造样例数据 data = { 'user_id': [1, 1, 2, 2, 2], 'title': ['歌曲A', '歌曲B', '歌曲A', '歌曲C', '歌曲C'], 'listen_count': [5, 3, 2, 4, 2] } df = pd.DataFrame(data) # 完整计算流程 user_total_listens = df.groupby('user_id')['listen_count'].sum().reset_index(name='total_listens') df_with_total = df.merge(user_total_listens, on='user_id', how='left') df_with_total['listen_frequency'] = df_with_total['listen_count'] / df_with_total['total_listens'] # 打印结果 print(df_with_total)
运行后输出:
user_id title listen_count total_listens listen_frequency
0 1 歌曲A 5 8 0.6250
1 1 歌曲B 3 8 0.3750
2 2 歌曲A 2 8 0.2500
3 2 歌曲C 4 8 0.5000
4 2 歌曲C 2 8 0.2500
内容的提问来源于stack exchange,提问作者Pybubb
相关产品推荐
相关产品推荐

