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
相关产品推荐
相关产品推荐

