使用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
相关产品推荐
相关产品推荐

