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

