如何基于多列短语匹配两个Pandas DataFrame生成结果集
解决方案
核心思路
先通过Region和Entity字段合并两个DataFrame,缩小需要检查的配对范围;再通过自定义函数检查Desk和Function字段的短语交集,最终生成符合要求的结果表。
步骤1:定义短语匹配辅助函数
这个函数负责检查两个文本字段是否存在共同短语,支持预处理(比如大小写统一、去除标点):
import pandas as pd import string def has_matching_phrase(text1, text2, sep=' '): # 处理空值情况 if pd.isna(text1) or pd.isna(text2): return False # 文本预处理:转小写、去除标点、拆分短语 translator = str.maketrans('', '', string.punctuation) phrases1 = set(text1.strip().lower().translate(translator).split(sep)) phrases2 = set(text2.strip().lower().translate(translator).split(sep)) # 检查是否有交集短语 return len(phrases1 & phrases2) > 0
步骤2:合并DataFrame并检查匹配
先按Region和Entity做左连接(保留df2所有行),再逐行检查Desk和Function的匹配情况:
# 合并df2和df1,保留df2全部数据 merged = pd.merge( df2[['Id', 'Region', 'Entity', 'Desk', 'Function']], df1[['Key', 'Region', 'Entity', 'Desk', 'Function']], on=['Region', 'Entity'], how='left', suffixes=('_df2', '_df1') ) # 检查Desk和Function的短语匹配 merged['desk_match'] = merged.apply( lambda row: has_matching_phrase(row['Desk_df1'], row['Desk_df2']) if pd.notna(row['Desk_df1']) else False, axis=1 ) merged['function_match'] = merged.apply( lambda row: has_matching_phrase(row['Function_df1'], row['Function_df2']) if pd.notna(row['Function_df1']) else False, axis=1 ) # 生成最终匹配状态:Desk和Function都匹配才为True merged['匹配状态'] = merged['desk_match'] & merged['function_match']
步骤3:生成最终结果表
提取需要的列,得到包含df2.Id、df1.Key和匹配状态的结果:
result = merged[['Id', 'Key', '匹配状态']]
注意事项
- 如果短语不是用空格分隔,修改
has_matching_phrase函数的sep参数(比如逗号sep=',')。 - 如果不需要保留df2的全部行,把merge的
how='left'改成how='inner',只保留有共同Region/Entity的行。 - 若需要更精准的匹配(比如短语部分匹配),可以把集合交集改成遍历检查短语是否包含在对方文本中,但性能会有所下降(适合df1和df2数据量差距极大的场景)。
内容的提问来源于stack exchange,提问作者deric
相关产品推荐
相关产品推荐

