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

Python3.7中两个DataFrame的条件合并问题

你的方法不可行,问题出在这几点:
  • 用iterrows()遍历的时候,每次循环里的merge操作结果没有被保存,只是临时执行,不会生成最终的合并结果。
  • 判断空值用row['term1'] is None不准确,Pandas里的空值一般是NaN,得用pd.isna()来判断才对。
  • 循环里的break会直接终止整个循环,而不是跳过空值行,完全不符合你“忽略值为None的情况”的需求。
更高效的实现方式

别用循环,用Pandas的内置方法处理,效率高还不容易出错:

步骤1:把df1转成“长格式”,过滤空值

先把term1和term2里的非空值单独拆成一行,保留对应的col1信息:

import pandas as pd

# 先构造你的df1(如果已经有了就跳过这步)
df1 = pd.DataFrame({
    'col1': ['ab|a', 'cd'],
    'term1': ['ab', 'cd'],
    'term2': ['a', pd.NA]
})

# 转换为长格式,过滤掉空的term
df_long = df1.melt(id_vars=['col1'], value_vars=['term1', 'term2'], value_name='term')
df_long = df_long.dropna(subset=['term']).drop(columns=['variable'])

处理后df_long的结构是:

col1term
aba
aba
cdcd

步骤2:和df2合并

直接用处理后的长格式表和df2按对应列做内合并:

# 示例df2(替换成你的实际df2)
df2 = pd.DataFrame({
    'STR': ['ab', 'a', 'cd', 'ef'],
    'value': [1, 2, 3, 4]
})

# 执行合并
final_result = df_long.merge(df2, left_on='term', right_on='STR', how='inner')

这样就自动忽略了所有空值的情况,得到所有有效term匹配后的结果。

如果要保留原df1的行结构

要是你希望最终结果和原df1的行对应,把同一行的匹配结果聚合起来,可以这样做:

result_grouped = final_result.groupby('col1').agg(
    匹配的terms=('term', ', '.join),
    对应的值=('value', ', '.join)
).reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:20:20