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

如何优化仅对符合条件的行执行DataFrame左连接操作?

高效实现带条件的DataFrame左连接优化

我需要将df_1与df_2基于列a执行左连接,常规实现代码为:
df_3 = df_1.merge(df_2, on="a", how="left")

已知当df_1的b列等于0时,df_2中绝不会存在对应的a值,因此希望仅对df_1中b != 0的行执行连接以优化性能,如何高效得到目标df_3?

输入

import pandas as pd

d = {'a': list('ABCDEF'),
     'b': list('111000')}
df_1 = pd.DataFrame(data=d)

#    a  b
# 0  A  1
# 1  B  1
# 2  C  1
# 3  D  0
# 4  E  0
# 5  F  0

d = {'a': list('ABC'),
     'c': list('xyz')}
df_2 = pd.DataFrame(data=d)

#    a  c
# 0  A  x
# 1  B  y
# 2  C  z

预期输出

df_3

#    a  b    c
# 0  A  1    x
# 1  B  1    y
# 2  C  1    z
# 3  D  0  NaN
# 4  E  0  NaN
# 5  F  0  NaN

解决方案

核心思路是拆分原DataFrame,仅对需要匹配的行执行连接,避免无意义的计算:

  1. 把df_1拆分为两部分:需要和df_2连接的(b != '0'的行)、不需要连接的(b == '0'的行)
  2. 仅对需要连接的部分执行左连接操作
  3. 合并两部分数据,恢复原数据的顺序

实现代码:

# 拆分数据
df_need_join = df_1[df_1['b'] != '0']
df_no_join = df_1[df_1['b'] == '0']

# 执行连接
df_joined = df_need_join.merge(df_2, on='a', how='left')

# 合并并恢复原顺序
df_3 = pd.concat([df_joined, df_no_join], ignore_index=True)
# 按原df_1的索引排序,保证结果顺序和原数据一致
df_3 = df_3.loc[df_1.index]

如果b列是数值类型(而非示例中的字符串),只需将判断条件改为df_1['b'] != 0和df_1['b'] == 0即可。

这种方法的优势在于大幅减少了merge操作处理的行数,尤其是当df_1中b == 0的行占比很高时,能显著提升运行效率,同时完全符合预期输出的结果要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:05:32