如何基于字符串包含条件合并两个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
相关产品推荐
相关产品推荐

