合并报表关键在数据对齐而非简单拼接:需统一会计期间(截取yyyy-mm)、标准化科目编码(通过mapping表映射)、重命名辅助核算字段,用outer merge比concat更可靠;差额计算前须处理浮点精度、nan和冲销凭证,并保留来源标识与操作日志。

合并报表前必须统一会计期间和科目编码
不同子公司导出的Excel或CSV里,日期格式、科目名称、辅助核算字段往往不一致,直接pandas.concat()会拼错行、漏数据。关键不是“合并”,而是“对齐”。
- 用
pd.to_datetime()强制转换所有日期列,并统一截取到YYYY-MM(如2024-03),避免“2024/3/31”“2024-03-31 00:00:00”混用 - 科目编码必须标准化:把“应收账款-客户A”“应收帐款_客户A”都映射到统一编码
1122.01,建议维护一个subject_mapping.csv表,用df.replace()批量替换 - 辅助核算(如部门、项目)字段名可能叫
dept、department_id、cost_center,需提前重命名为统一字段名再merge
用pd.merge()做多表对账比concat更可靠
合并报表本质是核对:总账余额 = 明细汇总 + 差异项。用concat堆叠数据只能看总量,没法定位哪笔没平。
- 把集团总账记为
df_group,各子公司明细记为df_sub1、df_sub2,先按['period', 'subject_code', 'dept']分组求和,再用pd.merge(df_group, df_sub1, on=['period','subject_code','dept'], how='outer', suffixes=('_group', '_sub1')) - 必须用
how='outer',否则漏掉只在某一方存在的差异行(比如子公司有而集团未入账的暂估) - 合并后新增列
diff = df['amount_group'] - df['amount_sub1'] - df['amount_sub2'],绝对值>0.01的行就是待查项
处理常见对账失败原因:浮点精度、空值、负向冲销
明明数字看起来一样,diff却不为0——这不是逻辑问题,是数据表示问题。
- Excel导出的金额常带多余小数位(如
100.00000000000001),读取时加dtype={'amount': 'float64'}并立刻用round(df['amount'], 2) -
NaN参与计算会污染整个差额,合并前用fillna(0),但要在日志里单独记录哪些行被补零了 - 冲销凭证常用红字(负数)或“摘要含【冲】字”,需检查是否被误过滤;建议加字段
is_reversal = df['summary'].str.contains('冲|red|REVERSE', na=False)
生成可追溯的对账报告,别只输出Excel
财务要的不是“平了”,而是“为什么平/不平”。自动化脚本必须保留原始键和操作痕迹。
- 最终结果DataFrame里必须保留来源标识列,如
source='group'、source='sub_beijing',方便双击下钻 - 用
df.to_excel(writer, sheet_name='detail')写明细,另起sheet写summary = df.groupby('source')['diff'].sum() - 最关键的:把每一步清洗逻辑(如“将‘其他应收款’映射为1221”)写进Excel的
sheet_notes或同目录log.txt,否则半年后没人记得为什么那样replace
真正卡住进度的,从来不是代码写不出来,而是某家子公司上月改了ERP导出模板,但没人通知你字段名从acc_code变成了account_cd——自动化系统得靠日志说话,不能靠人猜。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











