Pandas透视指定结构DataFrame 实现hh+id为索引的宽表转换
Pandas透视表实现长表转宽表+拼接复合索引方案
你原有pivot_table的核心逻辑是正确的,只是没有处理生成的多级索引、也没有做最终的结构调整,按以下步骤操作即可得到预期结果:
- 首先注意你给出的初始
df是字典格式,需要先转为Pandas的DataFrame对象才能调用透视方法 - 完成透视操作后,将多级行索引的
hh和id字段值拼接为单字符串索引 - 调整列顺序、重置索引即可匹配目标结构
完整可运行代码:
import pandas as pd # 加载原始数据为DataFrame df = pd.DataFrame({ 'hh': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'], 'id': ['1', '1', '2', '2', '1', '1', '2', '2'], 'var': ['height', 'gender', 'height', 'gender', 'height', 'gender', 'height', 'gender'], 'val': ['180', 'm', '172', 'f', '181', 'm', '170', 'f'] }) # 透视:因为每个(hh,id,var)组合对应唯一值,用pivot比pivot_table效率更高 pivot_df = df.pivot(index=['hh', 'id'], columns='var', values='val') # 拼接多级索引为hh+id格式的单索引 pivot_df.index = pivot_df.index.map(lambda x: x[0] + x[1]) # 调整结构匹配目标输出 result = pivot_df.reset_index().rename(columns={'hh': 'index'})[['index', 'gender', 'height']]
运行后输出的result完全匹配你要的结构:
index gender height 0 a1 m 180 1 a2 f 172 2 b1 m 181 3 b2 f 170
补充说明
注意:当每个索引+列组合对应唯一值时,优先用pivot()而非pivot_table(),执行效率更高
- 你之前执行代码只看到多级索引、没有看到gender/height列,是因为传入
index=['hh','id']时Pandas默认生成MultiIndex多级行索引,不会自动拼接为单索引;只要columns参数传入正确,var的取值会自动转为列名,不需要额外处理 - 如果后续你的数据存在同一个(hh,id,var)组合对应多条记录的情况,可以把
pivot换成pivot_table,加上aggfunc参数指定聚合规则即可,比如取第一条值就写df.pivot_table(index=['hh', 'id'], columns='var', values='val', aggfunc='first')
内容的提问来源于stack exchange,提问作者trym
相关产品推荐
相关产品推荐

