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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:20:29