如何使用pandas对比新表与主表并提取新表中唯一新增行
pandas实现提取新表新增行并追加到主表的方法
实现逻辑
默认ID为唯一主键,匹配ID不在主表中的新表行即为新增唯一行,若需要整行完全匹配可调整匹配逻辑。
分步实现代码
1. 导入库并读取数据
import pandas as pd # 读取主表和新表,可替换为你自己的文件读取逻辑,比如pd.read_excel、pd.read_csv # 以下为示例构造数据 df_main = pd.DataFrame({ 'ID': [1,2,3,4,5], 'Name': ['AA','BB','CC','DD','EE'], 'Location': ['1234','2345','3456','4567','5678'] }) df_new = pd.DataFrame({ 'ID': [2,4,5,6,7], 'Name': ['BB','DD','EE','FF','GG'], 'Location': ['2345','4567','5678','6789','7890'] })
2. 提取新表的新增唯一行
两种常用方案按需选择:
方案1:仅按唯一主键ID匹配(性能更高,适合数据量大的场景)
# ~表示取反,筛选ID不在主表ID列表中的新表行 new_rows = df_new[~df_new['ID'].isin(df_main['ID'])].copy()
方案2:整行完全匹配(更严谨,适合存在主键相同但其他字段更新的场景)
# 外连接合并两张表,新增_merge列标记行来源 merged_df = df_main.merge(df_new, how='outer', indicator=True) # 筛选仅存在于新表中的行,删除标记列 new_rows = merged_df[merged_df['_merge'] == 'right_only'].drop(columns='_merge').copy()
运行后new_rows的结果与期望输出完全一致:
| ID | Name | Location |
|---|---|---|
| 6 | FF | 6789 |
| 7 | GG | 7890 |
3. 编辑新增行(按需操作)
可对提取出来的new_rows做任意编辑处理,比如修改字段、补充新列等,示例:
# 示例:给新增行补充录入月份字段 new_rows['input_month'] = '2024-05'
4. 追加到主表
# 合并主表和处理后的新增行,ignore_index=True重置索引避免重复 df_main = pd.concat([df_main, new_rows], ignore_index=True) # 处理完成后可保存主表到文件,比如df_main.to_excel('主表.xlsx', index=False)
注意事项
- 如果唯一主键是多列组合,可以把方案1的isin条件改成多列合并后判断,或者直接用方案2的整行匹配即可。
copy()方法是为了避免后续编辑新增行时触发pandas的链式赋值警告,建议保留。
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

