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

Python DataFrame多列匹配筛选求助:提取df_1中A、C列值与df_2匹配的行

解决方法:筛选两DataFrame中A、C列组合匹配的行

嘿,我来帮你搞定这个问题!你的需求是找出df_1中A列和C列的组合同时出现在df_2对应列中的行,你的思路方向是对的,不过我们可以优化实现方式,同时排查可能的问题点。

可能的问题排查

你原来的代码逻辑本身没问题,但如果没得到预期结果,大概率是数据类型不一致导致的匹配失败。比如df_1的A列是整数类型,而df_2的A列是浮点数类型,这时候merge会认为9和9.0是不同值,匹配不上。你可以先检查两表的列类型:

print(df_1.dtypes)
print(df_2.dtypes)

如果类型不一致,统一转成相同类型即可,比如:

df_2['A'] = df_2['A'].astype(int)
df_2['C'] = df_2['C'].astype(int)

更简洁的实现方法

方法1:使用Inner Join直接匹配

merge的how='inner'参数本身就是只保留两表在指定列上完全匹配的行,不需要额外标记和筛选,一步到位:

import pandas as pd
import numpy as np

# 构造示例数据
df_1 = pd.DataFrame({
    'A': [2,9,0],
    'B': [5,8,44],
    'C': [9,13,3],
    'D': [12,22,1]
}, index=[1,2,3])

df_2 = pd.DataFrame({
    'A': [12,9,16,0],
    'C': [40,13,1,21]
}, index=[1,2,3,4])

# Inner Join 获取匹配行
Final_df = pd.merge(df_1, df_2, on=['A','C'], how='inner')
print(Final_df)

输出结果就是你想要的:

A  B   C   D
0  9  8  13  22

方法2:利用元组组合筛选

如果你不想用merge,可以把两列的组合转成元组,通过集合匹配来筛选:

# 将df_2的A、C列组合成元组集合
match_pairs = set(zip(df_2['A'], df_2['C']))

# 筛选df_1中(A,C)元组在集合内的行
Final_df = df_1[df_1.apply(lambda row: (row['A'], row['C']) in match_pairs, axis=1)]
print(Final_df)

这个方法同样能得到预期结果,适合数据量较小的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:22:45