如何调整pandas pivot_table将横向展示的数值字段转为纵向排列
解决方案
方法1:基于你现有stack()结果调整
你已经通过stack(0)把数值字段转成了行索引的第二级,只需要把行索引转为普通列,再调整列顺序即可:
# 承接你已有的p1结果 s3 = p1.stack(0).reset_index() # 重命名数值字段对应的列 s3 = s3.rename(columns={"level_1": "数值字段"}) # 调整列顺序,把数值字段放在第一列 s3 = s3[["数值字段", "b", "a", "b", "c"]]
输出的结构如下:
| 数值字段 | b | a | b | c |
|---|---|---|---|---|
| n1 | d | 1.0 | 1.0 | NaN |
| n2 | d | 5.0 | 6.0 | NaN |
| n3 | d | 10.0 | 10.0 | NaN |
| n1 | f | NaN | NaN | 1.0 |
| n2 | f | NaN | NaN | 7.0 |
| n3 | f | NaN | NaN | 10.0 |
方法2:先转长表再透视,一步到位
如果不想后续调整结构,可以先把宽表转为长表,再做透视,直接得到目标格式:
import pandas as pd # 测试数据 exp_1 = pd.DataFrame({'a':['a','b','c'],'b':['d','d','f'],'n1':[1,1,1],'n2':[5,6,7],'n3':[10,10,10]}) # 先把n1/n2/n3转为行维度 exp_1_long = exp_1.melt(id_vars=['a','b'], value_vars=['n1','n2','n3'], var_name='数值字段') # 透视时直接把数值字段设为第一级索引 p1_new = exp_1_long.pivot_table(index=['数值字段','b'], columns='a', values='value', aggfunc='sum').reset_index()
两种方法最终得到的结果完全一致,都可以实现将n1、n2、n3作为单独第一列展示的需求。
内容的提问来源于stack exchange,提问作者Adam_Gie
相关产品推荐
相关产品推荐

