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

如何在Pandas透视表中将值字段转为行而非列

如何在Pandas透视表中将值字段转为行而非列

嘿,我来帮你搞定这个需求!你想要的效果其实是先把数据做宽表转长表的重塑,把value_1和value_2从列转换为行,之后再调整结构让time作为唯一的列维度。这里有两种简洁的实现方法,都能得到你期望的结果:

方法一:用melt + pivot组合

melt可以帮你把分散的value_*列合并成一个新的行维度(也就是你说的head_3),之后用pivot把time转成列即可:

import pandas as pd

# 你的原始数据
x = pd.DataFrame([[1, 'step', 'id', 22, 33], 
                  [2, 'step', 'id', 55, 66]], 
                  columns=['time', 'head_1', 'head_2', 'value_1', 'value_2'])

# 1. 用melt把value_1/value_2转成行,生成head_3列
melted_df = x.melt(
    id_vars=['time', 'head_1', 'head_2'],  # 保留作为标识的列
    value_vars=['value_1', 'value_2'],     # 需要转成行的列
    var_name='head_3',                     # 新行维度的列名
    value_name='value'                     # 对应值的列名
)

# 2. 用pivot把time转成列,设置多层索引
result = melted_df.pivot(
    index=['head_1', 'head_2', 'head_3'],  # 行索引
    columns='time',                        # 列维度
    values='value'                         # 填充的数值
)

# 查看结果
print(result)

运行后输出的结果正好是你想要的格式:

time                       1   2
head_1 head_2 head_3                       
step   id     value_1     22  55
              value_2     33  66

方法二:用stack + unstack组合

这种方法更偏向Pandas的索引操作,通过堆叠(stack)和反堆叠(unstack)来调整维度:

# 1. 设置初始索引,然后堆叠value列到行维度
stacked_df = x.set_index(['time', 'head_1', 'head_2']).stack().reset_index()
# 重命名列名,对应head_3和数值
stacked_df.columns = ['time', 'head_1', 'head_2', 'head_3', 'value']

# 2. 反堆叠time列,得到目标格式
result = stacked_df.set_index(['head_1', 'head_2', 'head_3', 'time'])['value'].unstack('time')

print(result)

这个方法的输出和方法一完全一致,适合习惯用索引操作的同学。

为什么原来的pivot_table达不到效果?

你之前用的pivot_table会把values参数里的字段作为列的上层维度,而我们需要的是把这些字段放到行索引里。所以必须先通过melt或stack把宽表转成长表,让value_1/value_2成为行的一部分,再进行透视操作。

备注:内容来源于stack exchange,提问作者LaTeXFan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:28:11