Python中忽略指定列对比Pandas DataFrame并生成差异结果
对比两个Pandas DataFrame并保留原列信息的解决方案
核心思路
不用删除Database列,而是通过外连接合并+归属标记的方式,既保留所有原列数据,又能基于Table、Column、Datatype三列判断每行的归属。
步骤与代码示例
1. 准备示例数据(模拟你的场景)
import pandas as pd # 示例df1 df1 = pd.DataFrame({ 'Database': ['DB_A', 'DB_A', 'DB_A'], 'Table': ['users', 'orders', 'products'], 'Column': ['id', 'order_id', 'prod_name'], 'Datatype': ['INT', 'VARCHAR', 'TEXT'] }) # 示例df2 df2 = pd.DataFrame({ 'Database': ['DB_B', 'DB_B', 'DB_B'], 'Table': ['users', 'orders', 'inventory'], 'Column': ['id', 'order_date', 'stock_qty'], 'Datatype': ['INT', 'DATE', 'INT'] })
2. 外连接合并并生成归属标记
通过merge的indicator参数自动生成每行的来源标记,同时保留两边的所有原列(包括Database):
# 基于指定三列做外连接,保留所有行并标记来源 merged_df = pd.merge( df1, df2, on=['Table', 'Column', 'Datatype'], how='outer', indicator=True ) # 将_merge列的标记转换为易读的结果 merged_df['CompareResult'] = merged_df['_merge'].map({ 'left_only': '仅存在于df1', 'right_only': '仅存在于df2', 'both': '同时存在于两者' }) # 可选:删除临时的_merge列,或者保留查看 compared_df = merged_df.drop(columns=['_merge'])
3. 最终结果说明
生成的compared_df会包含:
- 原df1的
Database列(重命名为Database_x) - 原df2的
Database列(重命名为Database_y) - 用于对比的
Table、Column、Datatype三列 - 标记归属的
CompareResult列
对于示例数据,最终结果如下:
| Database_x | Table | Column | Datatype | Database_y | CompareResult |
|---|---|---|---|---|---|
| DB_A | users | id | INT | DB_B | 同时存在于两者 |
| DB_A | orders | order_id | VARCHAR | NaN | 仅存在于df1 |
| DB_A | products | prod_name | TEXT | NaN | 仅存在于df1 |
| NaN | orders | order_date | DATE | DB_B | 仅存在于df2 |
| NaN | inventory | stock_qty | INT | DB_B | 仅存在于df2 |
额外处理建议
如果你的DataFrame中存在重复的Table+Column+Datatype组合行,可以先去重再合并,避免生成冗余数据:
# 对df1去重 df1 = df1.drop_duplicates(subset=['Table', 'Column', 'Datatype']) # 对df2去重 df2 = df2.drop_duplicates(subset=['Table', 'Column', 'Datatype'])
内容的提问来源于stack exchange,提问作者Sreekar R
相关产品推荐
相关产品推荐

