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

Python中如何对比行数不等的DataFrame并提取DF2的独有记录

过滤DataFrame保留与另一个DataFrame匹配的行以对齐行数

我有两个来自不同环境的SQL查询结果DataFrame:

  • DF1(Env1)的PK列数据:{11,13,15,17,20}
  • DF2(Env2)的PK列数据:{11,12,13,15,16,17,20,25}

我需要提取并移除DF2中独有的值(12,16,25),让DF1和DF2的行数一致,这样才能执行后续的对比函数。之前尝试用Merge方法:

df_all = df1.merge(df2.drop_duplicates(), on=['PK'], how='left')

但不管用左连接还是右连接,df_all的记录数都和DF2一样,求更优的实现方法。


方法1:用isin()直接筛选(最直观)

直接过滤DF2,只保留PK存在于DF1的行,步骤简单高效:

# 先确保DF1的PK无重复(如果原数据有重复的话)
df1_unique = df1.drop_duplicates(subset=['PK'])
# 过滤DF2,仅保留和DF1重叠的PK行
df2_filtered = df2[df2['PK'].isin(df1_unique['PK'])]

处理后df2_filtered的PK集合和DF1完全一致,行数也和DF1去重后的行数匹配。

方法2:正确使用Merge实现过滤

你之前的Merge用法没抓住核心,换用内连接或带标记的左连接即可:

方式A:内连接直接取交集

# 内连接只保留两边都存在的PK,自动对齐行数
df_merged = df1.drop_duplicates(subset=['PK']).merge(df2.drop_duplicates(subset=['PK']), on=['PK'], how='inner')
# 若要保留DF2原列结构,提取对应列即可
df2_filtered = df_merged[df2.columns]

方式B:左连接+来源标记过滤

# 左连接时添加_merge列标记行的来源
df_all = df2.merge(df1.drop_duplicates(subset=['PK']), on=['PK'], how='left', indicator=True)
# 只保留两边都存在的行,再删除标记列
df2_filtered = df_all[df_all['_merge'] == 'both'].drop(columns=['_merge'])

方法3:用集合交集快速过滤

先提取两个DataFrame的PK交集,再用交集筛选DF2:

# 获取两个DataFrame的PK唯一值交集
common_pks = set(df1['PK'].unique()) & set(df2['PK'].unique())
# 过滤DF2
df2_filtered = df2[df2['PK'].isin(common_pks)]

内容的提问来源于stack exchange,提问作者Neha M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:30:06