pandas pivot_table非空写入Excel后工作表内容缺失问题
问题原因
pivot_table 方法中传入index参数指定的字段,会成为生成结果的行索引,不属于DataFrame的普通存储列:
- 直接执行
print(result)时,pandas默认会把行索引和普通列一起打印展示,所以你能看到Client Code、Client Name和计算后的财年内容,会误以为所有字段都属于普通列。 - 调用
to_excel时传入了index=False参数,该参数的作用是导出Excel时丢弃所有行索引内容,最终就只会保留作为values传入的Fiscal year的聚合计算结果,两个索引字段的内容全部缺失。
解决方案
二选一即可:
- 方案1:保留索引导出,去掉
index=False参数(to_excel默认index=True,会自动把多级索引按字段名导出为对应列),修正后代码如下:
result = df.pivot_table( index=['Client Code','Client Name'], values='Fiscal year', aggfunc = lambda x: '/'.join(list(set(str(v) for v in x))) ) writer = pd.ExcelWriter('resultnew.xlsx', mode='w', engine='openpyxl') result.to_excel(writer, sheet_name='Data') writer.close()
注意:pandas新版本中已经不推荐手动调用
writer.save(),统一用writer.close()即可,也可以用with上下文写法自动处理关闭逻辑,避免文件句柄残留。
- 方案2:导出前先把索引重置为普通列,再保留原有
index=False的写法也可以正常导出全部内容:
result = df.pivot_table( index=['Client Code','Client Name'], values='Fiscal year', aggfunc = lambda x: '/'.join(list(set(str(v) for v in x))) ) # 重置索引,将行索引转换为普通数据列 result = result.reset_index() writer = pd.ExcelWriter('resultnew.xlsx', mode='w', engine='openpyxl') result.to_excel(writer, sheet_name='Data', index=False) writer.close()
内容的提问来源于stack exchange,提问作者Vito G.
相关产品推荐
相关产品推荐

