如何使用Pandas的df.compare比较行数不等的DataFrame并检测新增行?
解决方案:无需追加空行,用索引对齐+分场景处理
完全没必要强行给其中一个DataFrame追加空行——这种方式不仅繁琐,还会引入不必要的NaN值,反而给后续处理添乱。我们可以利用Pandas的索引对齐特性,分步骤处理新增行识别和数值差异对比,这种方案更优雅也更贴合实际需求。
第一步:准备数据
首先把你给出的字典转换成标准的Pandas DataFrame:
import pandas as pd df_1 = pd.DataFrame({'budget_id':['1', '2', '3', '4'], 'budget_amount':[200, 300, 400, 500]}) df_2 = pd.DataFrame({'budget_id':['1', '2', '3', '4', '5'], 'budget_amount':[200, 300, 400, 550, 700]})
第二步:用唯一标识对齐索引
把budget_id设为索引(它是每行的唯一标识),这样Pandas就能自动对齐两个DataFrame的匹配行:
df1_idx = df_1.set_index('budget_id') df2_idx = df_2.set_index('budget_id')
第三步:识别新增行
直接通过索引的差集找出df_2中存在但df_1中没有的行:
# 获取df_2的新增行 new_rows = df2_idx.loc[df2_idx.index.difference(df1_idx.index)] print(new_rows)
输出结果:
budget_amount budget_id 5 700
第四步:对比共同行的数值差异
对两个DataFrame共有的索引行,使用compare方法处理数值变化:
# 对比共同行的数值差异,并重命名层级索引 diff_values = df1_idx.compare(df2_idx, align_axis=0, keep_equal=True).rename( index={'self': 'Prev', 'other': 'New'}, level=1 ) print(diff_values)
输出结果:
budget_amount budget_id 4 Prev 500 New 550
第五步:合并结果(可选)
如果想要把新增行和数值差异合并成一个统一的结果,可以用concat拼接,再调整排序:
# 给新增行添加层级索引(和diff_values格式对齐) new_rows_formatted = new_rows.rename(lambda x: (x, 'New')) # 合并并排序 combined_diff = pd.concat([diff_values, new_rows_formatted]).sort_index() print(combined_diff)
输出结果:
budget_amount budget_id 4 Prev 500 New 550 5 New 700
为什么这是更优方案?
- 避免了手动追加空行带来的NaN污染,数据更干净
- 逻辑清晰:分开处理「新增/缺失行」和「数值变化」两种场景
- 完全利用Pandas原生特性,代码简洁易维护
内容的提问来源于stack exchange,提问作者A Clockwork Orange
相关产品推荐
相关产品推荐

