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

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_xTableColumnDatatypeDatabase_yCompareResult
DB_AusersidINTDB_B同时存在于两者
DB_Aordersorder_idVARCHARNaN仅存在于df1
DB_Aproductsprod_nameTEXTNaN仅存在于df1
NaNordersorder_dateDATEDB_B仅存在于df2
NaNinventorystock_qtyINTDB_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:31:20