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

Pandas pivot_table无法生成目标格式的问题求助

解决DataFrame多级列格式调整问题

嘿,我完全懂你这种 frustration——pivot_table 有时候在列层级的排布上确实会跟咱们想要的不一样,尤其是当目标是特定的多级列结构时。咱们直接上解决方案,一步步来调整到你想要的格式。

首先,先明确咱们的目标:从你的原始数据来看,应该是想要行是 index_1 + month 的组合,列是 index_2 作为上层、value_1/value_2 作为下层的多级列结构(如果你的目标格式略有不同,调整参数就行,思路是通用的)。

方法1:用 pivot + 层级交换

pivot 比 pivot_table 更适合这种不需要聚合的场景,之后只要调整列的层级顺序就能搞定:

import pandas as pd

# 你的原始DataFrame
df = pd.DataFrame({
 'index_1' : ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
 'index_2' : ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'],
 'month' : ['jan', 'jan', 'feb', 'feb', 'jan', 'jan', 'feb', 'feb'],
 'value_1' : range(0, 8),
 'value_2' : range(8, 16)
})

# 生成基础的多级列结构
pivoted = df.pivot(
    index=['index_1', 'month'],  # 行索引:组合index_1和month
    columns='index_2',           # 列的一个层级:index_2的取值
    values=['value_1', 'value_2']# 列的另一个层级:value字段
)

# 交换列的层级顺序(把index_2放到上层,value字段放到下层)
pivoted = pivoted.swaplevel(0, 1, axis=1).sort_index(axis=1)

# 查看结果
print(pivoted)

运行后输出的格式就是咱们想要的:

index_2          A       B       C       D      
              value_1 value_2 value_1 value_2 value_1 value_2 value_1 value_2
index_1 month                                                                
A       jan        0       8       1       9      NaN     NaN      NaN     NaN
        feb       NaN     NaN      NaN     NaN       2      10       3      11
B       jan        4      12       5      13      NaN     NaN      NaN     NaN
        feb       NaN     NaN      NaN     NaN       6      14       7      15

方法2:用 set_index + unstack 更灵活

如果需要更灵活的层级控制,也可以用索引堆叠再展开的方式:

# 把行索引设置为index_1、month、index_2的组合
df_indexed = df.set_index(['index_1', 'month', 'index_2'])

# 把index_2从行索引展开到列
unstacked = df_indexed.unstack('index_2')

# 同样交换列层级并排序
unstacked = unstacked.swaplevel(0, 1, axis=1).sort_index(axis=1)

为什么之前的方法没生效?

你之前用 pivot_table 得到的数据正确但格式不对,是因为 pivot_table 默认会把 values 参数的字段放在列层级的上层,而 columns 参数的字段放在下层——咱们要的刚好反过来,所以用 swaplevel(0,1, axis=1) 就能交换这两个层级的位置,再用 sort_index 把列整理得更整齐。

如果你的目标格式不是上面这种,比如行是 index_2、列是 index_1+month 对应value字段,只要调整 pivot 里的 index 和 columns 参数就行,思路完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:53:10