如何用Pandas自动添加未评分的用户-音乐组合行并设has_rating为0
Pandas生成用户与音乐的全组合并补充缺失评分行
需求说明
给定包含用户、音乐及已有评分标记的DataFrame,需要生成所有用户与音乐的笛卡尔积组合,原有组合保留原评分值,新增组合的评分标记设为0。
实现方法
方法一:生成全组合后左连接
- 构造原始数据
import pandas as pd # 原始DataFrame df = pd.DataFrame({ 'user_id': ['A', 'B'], 'music_id': ['a', 'b'], 'has_rating': [1, 1] })
- 生成所有用户-音乐组合
提取唯一的用户和音乐列表,用from_product生成全组合:
# 获取唯一用户和音乐集合 unique_users = df['user_id'].unique() unique_musics = df['music_id'].unique() # 生成所有可能的组合 all_pairs = pd.MultiIndex.from_product( [unique_users, unique_musics], names=['user_id', 'music_id'] ).to_frame(index=False)
- 合并原始数据并填充缺失值
通过左连接将原始评分匹配到全组合中,缺失的评分用0填充:
# 左连接匹配原始数据,填充缺失值 final_df = all_pairs.merge(df, on=['user_id', 'music_id'], how='left') final_df['has_rating'] = final_df['has_rating'].fillna(0).astype(int)
方法二:用透视表快速实现
利用pivot_table一步完成透视、填充、转置操作,代码更简洁:
final_df = df.pivot_table( index='user_id', columns='music_id', values='has_rating', fill_value=0 ).stack().reset_index(name='has_rating')
最终结果
执行上述代码后,得到的final_df如下:
| user_id | music_id | has_rating |
|---|---|---|
| A | a | 1 |
| A | b | 0 |
| B | a | 0 |
| B | b | 1 |
内容的提问来源于stack exchange,提问作者DS Park
相关产品推荐
相关产品推荐

