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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:09:02