如何按rank_order顺序转置DataFrame并按user_id聚合游戏时长
Pandas DataFrame 行转列聚合方案
核心需求
- 以
user_id为聚合维度 - 按
rank_order的顺序,将对应game值映射为game_1、game_2……game_n列,列顺序严格匹配rank排序 - 聚合计算每个用户的总游戏时长
实现步骤(基于Pandas原生API,性能最优)
- 构造示例测试数据
import pandas as pd # 匹配提问中的示例数据结构 df = pd.DataFrame({ 'user_id': [1, 1, 1, 2, 2], 'game': ['Fortnight', 'COD', 'Horizon', 'Fifa2021', 'A Way Out'], 'game_hours': [1.5, 0.5, 1.7, 1.9, 0.2], 'rank_order': [1, 2, 3, 1, 2] })
- 透视生成排名对应游戏列
利用pivotAPI直接行转列,由于rank_order是数值类型,生成的列天然按1到n的顺序排列,添加前缀后直接匹配要求的列名:
game_col_df = df.pivot( index='user_id', columns='rank_order', values='game' ).add_prefix('game_').reset_index()
- 聚合计算每个用户总游戏时长
total_hours_df = df.groupby('user_id', as_index=False)['game_hours'].sum()
- 合并结果得到最终表
final_df = game_col_df.merge(total_hours_df, on='user_id') # 若需要将空值替换为空字符串而非默认NaN,可追加以下代码 # final_df = final_df.fillna('')
输出结果
执行代码后得到的final_df结构完全匹配要求:
user_id game_1 game_2 game_3 game_hours 0 1 Fortnight COD Horizon 3.7 1 2 Fifa2021 A Way Out NaN 2.1
方案说明
- 列顺序保证:
pivot会自动按rank_order数值升序排列列,加前缀后顺序和rank完全对应,无需额外手动排序 - 性能:全部使用Pandas原生向量化API,无逐行循环逻辑,处理十万到百万级数据效率远高于自定义循环、apply类写法
- 扩展性:不管单个用户最多有多少条游戏记录,都会自动生成对应数量的
game_x列,不需要提前硬编码列名
内容的提问来源于stack exchange,提问作者titutubs
相关产品推荐
相关产品推荐

