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

如何基于字符串包含条件合并两个Pandas DataFrame?

基于字符串包含关系合并DataFrame

需求场景

现有两个DataFrame:

  • df1:包含id和description列,数据为id=1对应Foo、id=2对应Bar
  • df2:包含description和category列,数据为Foo对应cat1、Barrista对应cat2

需要实现当df2的description字符串包含df1的description字符串时执行左合并,替代原精确匹配逻辑(原精确匹配会导致id=2的category字段为空,期望匹配到cat2)。

解决方案

步骤1:构造示例数据

import pandas as pd

df1 = pd.DataFrame({'id': [1, 2], 'description': ['Foo', 'Bar']})
df2 = pd.DataFrame({'description': ['Foo', 'Barrista'], 'category': ['cat1', 'cat2']})

步骤2:实现模糊包含匹配合并

方法一:使用apply逐行匹配(简洁直观)

# 为df1匹配符合包含条件的category
df1['category'] = df1['description'].apply(
    lambda x: df2[df2['description'].str.contains(x, na=False)]['category'].iloc[0] 
    if not df2[df2['description'].str.contains(x, na=False)].empty 
    else None
)

# 最终结果df3
df3 = df1.copy()

方法二:笛卡尔积+过滤(适合复杂匹配场景)

# 生成笛卡尔积,保留所有可能的组合
cross_join = df1.assign(temp_key=1).merge(df2.assign(temp_key=1), on='temp_key').drop('temp_key', axis=1)
# 过滤出符合包含关系的行
matched_rows = cross_join[cross_join.apply(lambda r: r['description_x'] in r['description_y'], axis=1)]
# 合并回原df1,保留所有df1的行
df3 = df1.merge(matched_rows[['id', 'category']], on='id', how='left')

最终结果

执行上述代码后,df3的输出为:

id description category
0   1         Foo     cat1
1   2         Bar     cat2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:20:40