如何将DataFrame列头转换为聚合行、指定列转换为新表头
实现方法
使用Pandas即可完成转换,核心逻辑是宽表转长表后分组聚合,再转回目标宽表结构,完整实现代码如下:
import pandas as pd # --------------- 如果你是要先构造测试原始数据,可执行这段 --------------- data = [ ['John', 'Minutes', 23, 32, 43, 21, 43, 35], ['John', 'Distance', 23.2, 32.7, 54.2, 24.2, 47.8, 32.1], ['John', 'Sprints', 5, 3, 8, 3, 9, 2], ['Bob', 'Minutes', 25, 23, 43, 31, 38, 23], ['Bob', 'Distance', 32.4, 35.6, 43.7, 21.8, 26.8, 12.5], ['Bob', 'Sprints', 8, 4, 8, 6, 9, 2], ] df = pd.DataFrame(data, columns=['Athlete', 'Variable', 28.0, 28.0, 28.0, 29.0, 29.0, 29.0]) # ------------------------------------------------------------------- # 1. 把周数列从宽格式转为长格式 df_melt = df.melt(id_vars=['Athlete', 'Variable'], var_name='week', value_name='value') # 2. 周数从浮点数转为整数 df_melt['week'] = df_melt['week'].astype(int) # 3. 按运动员、周、统计项分组求和 df_group = df_melt.groupby(['Athlete', 'week', 'Variable'])['value'].sum().reset_index() # 4. 把统计项从行转为列头,得到最终结果 df_result = df_group.pivot(index=['Athlete', 'week'], columns='Variable', values='value').reset_index() # 清除多余的列名索引 df_result.columns.name = None
执行完成后df_result就是你需要的目标结构,数值和要求的输出完全匹配。
内容的提问来源于stack exchange,提问作者Christian Rønsholt
相关产品推荐
相关产品推荐

