如何根据指定dataframe的条件过滤目标dataframe中的匹配行
Pandas多列组合过滤实现方案
实现思路
核心是动态读取df2的匹配规则,通过多列组合值匹配的方式过滤df1,无需硬编码任何过滤值,适配df2的内容变更。
- 仅需提前配置df1中与df2列顺序一一对应的匹配列名,核心逻辑永久生效
- 提供两种实现方案,分别适配不同数据量场景
完整可运行代码
import pandas as pd # 构造测试数据(实际使用时替换为自己的数据读取逻辑即可) df1 = pd.DataFrame({ 'from id': [1,4,5,2], 'from group': ['A','B','F','B'], 'to id': [3,4,5,3], 'to group': ['B','X','J','A'] }) df2 = pd.DataFrame({ 'From': ['A','F'], 'To': ['B','J'] }) # -------------------------- 核心配置(仅此处需要根据匹配规则调整) -------------------------- # 列表内的列名顺序需要和df2的列顺序一一对应,匹配列数变化时仅改此处即可 df1_match_cols = ['from group', 'to group'] # ----------------------------------------------------------------------------------------- # 方案1:集合匹配法,适合中小数据量,代码简洁 filter_keys = set(df2.itertuples(index=False, name=None)) df_result = df1[~df1[df1_match_cols].apply(tuple, axis=1).isin(filter_keys)] # 方案2:左连接反匹配法,适合大数据量,矢量化操作性能更高 # df2_renamed = df2.set_axis(df1_match_cols, axis=1) # df_merge = df1.merge(df2_renamed, on=df1_match_cols, how='left', indicator=True) # df_result = df_merge[df_merge['_merged'] == 'left_only'].drop('_merged', axis=1) # 输出结果 print(df_result)
灵活性说明
- df2的行内容增删改时,不需要修改任何逻辑,代码会自动读取最新的过滤规则
- 如果后续匹配维度变化(比如需要新增匹配列、调整匹配顺序),仅需要修改
df1_match_cols的配置,核心过滤逻辑完全不用调整
运行结果
| from id | from group | to id | to group | |
|---|---|---|---|---|
| 1 | 4 | B | 4 | X |
| 3 | 2 | B | 3 | A |
和需求预期输出完全一致。
内容的提问来源于stack exchange,提问作者tj judge
相关产品推荐
相关产品推荐

