如何使用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
相关产品推荐
相关产品推荐

