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

如何优雅地仅对Pandas DataFrame最后三列执行Unstack操作?

解决方案:针对指定列执行结构重塑并生成目标MultiIndex

原始数据

import numpy as np
import pandas as pd
data = pd.DataFrame(data=np.random.rand(10,5), columns=['headA','headB','tailA','tailB','tailC'])

需求说明

需要仅对最后三列(tailA、tailB、tailC)执行结构重塑,生成以pd.MultiIndex.from_product([data.columns[-3:], data.index])为新索引的结果,同时保留前两列的对应值。

优雅实现方案

方法一:使用melt重塑数据

melt是pandas中宽表转长表的常用工具,可快速将指定列展开为行:

# 提取目标列并执行melt处理
result = data.melt(
    id_vars=['headA', 'headB'],  # 保留作为标识的前两列
    value_vars=data.columns[-3:],  # 需要展开的最后三列
    var_name='tail_col',  # 新索引第一层级的名称
    value_name='value'
).set_index(['tail_col', data.index.repeat(3)]).sort_index()

方法二:使用stack操作(贴合Unstack反向逻辑)

如果想更贴近Unstack的反向思路,可通过stack实现:

# 先将前两列设为索引,再对目标列执行stack
result = (
    data.set_index(['headA', 'headB'])
    .stack()  # 将最后三列的列名转为索引层级
    .swaplevel(0, 1)  # 交换索引层级,让tail列名处于第一层级
    .sort_index()
)

验证索引匹配

通过以下代码可确认生成的索引与目标完全一致:

target_index = pd.MultiIndex.from_product([data.columns[-3:], data.index])
print(result.index.equals(target_index))  # 输出True

内容的提问来源于stack exchange,提问作者principal-ideal-domain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:22:13