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

如何使用Pandas提取DataFrame两列中的相似匹配字符?

问题描述

现有如下Pandas DataFrame,需要提取Name和Nickname两列之间的相似匹配字符:

import pandas as pd
data = [['thomas', 'tommy'], ['nickolas', 'nicky'], ['johnathan', 'johnny']]
df = pd.DataFrame(data, columns=['Name', 'Nickname'])

尝试使用isin()方法:

df['matches'] = df['Nickname'].isin(df['Name'])

但无法得到预期结果,期望输出相似匹配字符列表:

# Desired output
matching = ['tom','nick','john']
解决方案

isin()方法仅能检查整个字符串是否存在于另一列,不符合当前提取相似子串的需求。以下是两种针对示例场景的有效实现方式:

方法1:提取最长公共前缀

通过逐字符比对,找到每行两列字符串的最长公共前缀:

def get_common_prefix(name, nickname):
    common_chars = []
    # 统一转为小写避免大小写干扰
    name_lower, nick_lower = name.lower(), nickname.lower()
    for c1, c2 in zip(name_lower, nick_lower):
        if c1 == c2:
            common_chars.append(c1)
        else:
            break
    # 返回长度≥3的有效匹配(可根据需求调整阈值)
    return ''.join(common_chars) if len(common_chars) >=3 else ''

# 应用函数到每行数据
df['matches'] = df.apply(lambda row: get_common_prefix(row['Name'], row['Nickname']), axis=1)
# 提取结果列表
matching = df['matches'].tolist()
print(matching)  # 输出: ['tom', 'nick', 'john']

方法2:从长到短匹配前缀

通过遍历可能的前缀长度,优先返回最长的有效匹配:

def get_longest_match(name, nickname):
    max_possible_len = min(len(name), len(nickname))
    # 从最长可能长度往短遍历,找到第一个匹配的前缀
    for length in range(max_possible_len, 2, -1):
        if name[:length].lower() == nickname[:length].lower():
            return name[:length].lower()
    return ''

df['matches'] = df.apply(lambda row: get_longest_match(row['Name'], row['Nickname']), axis=1)
matching = df['matches'].tolist()
print(matching)  # 输出: ['tom', 'nick', 'john']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:15:08