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

使用unstack重塑Python DataFrame未达预期,求正确实现方案

问题:将DataFrame中行转列重新格式化数据

输入数据:

data = {'ID': ['Tom', 'Tom', 'Tom', 'Dick', 'Dick', 'Dick'],
        'TAG': ['instance', 'deadline', 'job', 'instance', 'deadline', 'job'],
        'VALUE': ['AA', '23:30', 'job01', 'BB', '02:15', 'job02']
        }
df = pd.DataFrame(data)

初始DataFrame:

ID       TAG  VALUE
0   Tom  instance     AA
1   Tom  deadline  23:30
2   Tom       job  job01
3  Dick  instance     BB
4  Dick  deadline  02:15
5  Dick       job  job02

期望结果:

ID    instance  deadline  job
Tom   AA        23:30     job01
Dick  BB        02:15     job02

尝试使用unstack但未得到预期结果,错误代码:

df = df.unstack().unstack()

错误结果:

0         1      2         3         4      5
ID          Tom       Tom    Tom      Dick      Dick   Dick
TAG    instance  deadline    job  instance  deadline    job
VALUE        AA     23:30  job01        BB     02:15  job02

解决方案

你之前的unstack用法错误,因为unstack是针对多层索引的操作,直接对普通DataFrame调用会把列转成索引层级,不符合需求。正确的实现方式有两种:

方法1:使用pivot方法

pivot是专门处理行转列的工具,直接指定行索引、列名和值的来源:

result = df.pivot(index='ID', columns='TAG', values='VALUE').reset_index()
# 去掉列名的层级标签
result.columns.name = None
print(result)

输出结果:

ID instance deadline    job
0  Dick       BB    02:15  job02
1   Tom       AA    23:30  job01

方法2:set_index + unstack(正确用法)

先把ID和TAG设置为多层索引,再对TAG层级进行unstack转列:

# 设置多层索引
df_indexed = df.set_index(['ID', 'TAG'])
# 对TAG层级执行unstack,转为列
result = df_indexed['VALUE'].unstack()
# 将ID从索引转回普通列(可选,按需调整)
result = result.reset_index()
result.columns.name = None
print(result)

输出结果和方法1一致:

ID instance deadline    job
0  Dick       BB    02:15  job02
1   Tom       AA    23:30  job01

关键说明

  • 直接调用unstack()会把原DataFrame的列(ID、TAG、VALUE)转成索引层级,这就是你得到错误结果的原因。必须先把需要分组的列(ID)和要转成列的字段(TAG)设置为索引,再对TAG层级执行unstack。
  • reset_index()用于把ID从索引转回普通列,columns.name = None用于去掉列名的层级标签,让结果和你的期望格式完全匹配。

内容的提问来源于stack exchange,提问作者surge3333

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:30:21