You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 05:00:45