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

如何基于多列短语匹配两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:46:05