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
相关产品推荐
相关产品推荐

