如何在Pandas Merge操作中添加过滤条件且保留结果集全部左表行
问题原因
你原有代码的问题在于提前对左表df_input1做了行过滤,不符合条件的左表行直接被丢弃,自然无法保留在最终结果中,这和SQL中将过滤条件写在ON子句、仅作用于匹配逻辑的规则不符。
正确实现方案
方案1:先全量左连接,再清空不符合匹配条件行的右表字段
这个方法逻辑简单直观,和SQL语义完全对齐,适合数据量不大的场景:
import pandas as pd # 第一步:先按照key做全量左连接 df_merged = df_input1.merge(df_input2, on='key', how='left') # 第二步:定位不需要参与匹配的左表行(即A.value前两位在指定列表里的行) mask = df_input1['value'].str[:2].isin(['something', 'something else']) # 第三步:把这些行对应的右表所有字段设为缺失值 b_cols = df_input2.columns.tolist() df_merged.loc[mask, b_cols] = pd.NA df_output = df_merged
方案2:拆分左表分别处理后合并
如果右表数据量极大,不想做无效匹配可以用这个方法,能降低merge阶段的计算量:
# 拆分左表为需要匹配和不需要匹配两部分 mask = df_input1['value'].str[:2].isin(['something', 'something else']) df_need_match = df_input1[~mask] df_no_match = df_input1[mask] # 仅对需要匹配的部分做左连接 df_matched = df_need_match.merge(df_input2, on='key', how='left') # 给不需要匹配的部分补全右表字段,值全部为缺失值 for col in df_input2.columns: df_no_match[col] = pd.NA # 上下合并两部分得到最终结果 df_output = pd.concat([df_matched, df_no_match], ignore_index=True)
内容的提问来源于stack exchange,提问作者rluo
相关产品推荐
相关产品推荐

