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

Pandas DataFrame透视表问题:索引不重复与表头格式调整

Pandas透视表问题解答

原始DataFrame结构

Item_code   Type    year-month  Qty
0   TH-32H400M  O       Jan-22-Q    0.000000
1   TH-32H400M  MPO     Jan-22-Q    0.000000
2   TH-32H400M  ADJ     Jan-22-Q    0.000000
3   TH-32H400M  BP_O    Jan-22-Q    0.000000
4   TH-32H400M  LY_O    Jan-22-Q    0.000000
... ... ... ... ...
1795    TH-75JX660M P   Jun-23-Q    0.000000
1796    TH-75JX660M S   Jun-23-Q    11.538462
1797    TH-75JX660M BP_S    Jun-23-Q    0.000000
1798    TH-75JX660M LY_S    Jun-23-Q    0.000000
1799    TH-75JX660M I   Jun-23-Q    0.769231

执行以下透视代码后得到结果,但存在两个疑问:

new_df = new_df.pivot(index=['Item_code','year-month'], columns='Type', values='Qty')

疑问1:为什么Item_code的值未在每一行重复显示?

这是Pandas对**多层索引(MultiIndex)**的默认显示优化——当同一Item_code值连续出现在多行时,为了避免重复冗余,会自动合并显示,只在首次出现时展示值,后续行该位置留空。但本质上这些行的Item_code值和上方完全一致,只是显示做了简化。

如果要强制每一行都显示Item_code,关闭这个优化即可:

pd.set_option('display.multi_sparse', False)

执行后再查看new_df,就能看到每一行都重复显示Item_code的值。

疑问2:如何让所有列名在同一行显示?即去除Type层级,使Item_code、year-month与其他列名处于同一行。

pivot操作后,列会生成以Type为顶层的单层列索引(看似有层级,实际顶层就是Type,底层是具体类型值)。要实现列名扁平化,只需提取底层类型值作为列名,再把索引转为普通列:

# 去掉列的Type层级,用具体类型值作为列名
new_df.columns = new_df.columns.droplevel()
# 将多层索引转为普通列
new_df = new_df.reset_index()

处理后,Item_code、year-month和原Type对应的各类值都会作为普通列名在同一行显示,DataFrame变为常规的单层级列结构。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:20:34