如何在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
相关产品推荐
相关产品推荐

