You need to enable JavaScript to run this app. Pandas 无聚合操作下使用pivot/stack实现DataFrame透视的问题
优惠活动
大模型
产品
解决方案
定价
更多

Pandas 无聚合操作下使用pivot/stack实现DataFrame透视的问题

无聚合多级透视表实现方案

之前操作失效的核心原因

  • 原代码中df.set_index(['comp_id', 'ABH'])未赋值回变量、也未设置inplace=True参数,原DataFrame的行索引实际未被修改,后续stack/unstack操作基于原默认数字索引执行,自然无法得到预期结构。
  • 直接使用pivot方法时如果仅传入单个values参数,无法同时保留stk、list_date两个一级列维度,生成的结构和需求不匹配。

可直接运行的实现方案

方法1:原生pivot实现(最简洁)

pivot方法原生支持传入多列作为取值字段,自动生成两级列索引,无需手动堆叠/拆分索引,完全适配无聚合的透视需求:

import pandas as pd

data = {'comp_id': ['0001', '0001', '0002', '0003', '0003', '0003'],
        'stk': ['0001', '0001B', '0002', '0003', '0003B', '62208'],
        'list_date': ['20150101', '20150331', '20130425', '20170401', '20170501', '20170601'],
        'ABH': ['A', 'B', 'B', 'A', 'B', 'H']}
df = pd.DataFrame(data)

# 生成目标透视表
pivot_result = df.pivot(
    index='comp_id',  # 设置最终行索引
    columns='ABH',    # 设置二级列索引的来源字段
    values=['stk', 'list_date']  # 设置一级列索引的来源字段
)

方法2:多层索引配合unstack实现

如果需要基于行索引旋转的逻辑完成透视,可先设置多层行索引,再将ABH维度从行索引旋转到列层级:

# 正确设置多层行索引,需将结果赋值回新变量
df_multi_idx = df.set_index(['comp_id', 'ABH'])
# 将行索引中的ABH层级旋转为列的二级索引
unstack_result = df_multi_idx.unstack(level='ABH')

生成结果结构

两种方法的输出完全一致,结构如下:

stk             list_date
ABH     A      B     H         A         B         H
comp_id
0001  0001  0001B  NaN  20150101  20150331       NaN
0002    NaN   0002  NaN       NaN  20130425       NaN
0003  0003  0003B  62208  20170401  20170501  20170601

无匹配值的位置默认以NaN填充,和需求的空值逻辑完全一致。

注意事项

  • 仅当每个comp_id + ABH组合在原数据中唯一时,以上方法才能正常运行,若存在重复组合,pivot会直接抛出错误,需提前对原数据去重后再执行透视。
  • 如果需要强制指定二级列的顺序(比如固定按A、B、H排列),可在生成结果后执行pivot_result = pivot_result.reindex(columns=['A','B','H'], level=1)调整顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 07:06:04