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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:07:32