Pandas合并透视表异常:仅保留最后一个账户列数据问题排查
问题原因及解决方法
核心问题
你最后导出Excel时写错了变量名——你用的是pivot.to_excel(),但pivot是循环最后一次迭代生成的单个账户透视表,合并后的全量数据存在appended_data里,自然只保留了最后一个账户的数据。
额外优化点
其实完全没必要用pivot_table,原数据每行已经对应唯一的Date、Budget Flag(你代码里写的Budg)、Department(代码里的Depa)组合,直接把78个账户列转成「账户名-值」的长格式就行,用pandas的melt函数一步搞定,比循环高效得多。
修正后的两种方案
方案1:修复你原有的循环代码
只需把最后一行的导出对象改成appended_data:
import pandas as pd statement = pd.read_excel('Financial Dashboard Dataset.xlsx', sheet_name="Income Statement", header=0) appended_data = [] for i in range(3,81): value = statement.columns[i] pivot = pd.pivot_table(statement, values=value, index=['Date', 'Budg', 'Depa']) pivot = pivot.assign(Account=value) appended_data.append(pivot) appended_data = pd.concat(appended_data) # 这里把pivot改成appended_data appended_data.to_excel("final_product.xlsx", index=True, header=True)
方案2:用melt函数简化代码(推荐)
直接指定要保留的标识列和要转置的账户列,一行完成转换:
import pandas as pd # 读取数据 statement = pd.read_excel('Financial Dashboard Dataset.xlsx', sheet_name="Income Statement", header=0) # 转成长格式:保留Date、Budg、Depa作为标识列,其余列转成Account Name和Value long_format = pd.melt( statement, id_vars=['Date', 'Budg', 'Depa'], # 对应原表的Date、Budget Flag、Department列 var_name='Account Name', # 转置后的账户名列名 value_name='Value' # 转置后的数值列名 ) # 导出结果 long_format.to_excel("final_product.xlsx", index=False, header=True)
注意事项
- 确认原表中
Budget Flag的实际列名是Budg、Department是Depa,如果不是,要改成原表对应的列名(比如原列名是Budget Flag就写'Budget Flag')。 melt方法里的id_vars要和原表的标识列完全匹配,否则会报错。
内容的提问来源于stack exchange,提问作者bannisterrb
相关产品推荐
相关产品推荐

