如何按Unique ID分组比较DataFrame同组相邻行Name并计算相似度
问题根源
原有代码直接对全局Name列执行shift(-1),没有按Unique ID区分分组边界,上一个分组最后一行的下一行值会被错误赋值为下一个分组的首行Name,最终导致跨组匹配计算错误。
正确实现方案
核心逻辑是分组后再执行组内位移,从根源上避免跨组取值,具体实现代码如下:
import pandas as pd import numpy as np from fuzzywuzzy import fuzz # 按Unique ID分组,仅在组内取下一行Name值,每组最后一行自动赋值为NaN df['Name2'] = df.groupby('Unique ID', group_keys=False)['Name'].shift(-1) # 仅对同组配对的行计算相似度,组尾无配对行时Score留空 df['Score'] = df.apply( lambda row: fuzz.partial_ratio(row['Name'], row['Name2']) if pd.notna(row['Name2']) else np.nan, axis=1 ) # 不需要Name2校验列的话,直接执行下面这行删除即可 # df = df.drop(columns=['Name2'])
可选优化建议
- 算法选择:如果是短文本全量匹配,
fuzz.ratio的结果准确性比fuzz.partial_ratio更高;如果是长文本中包含目标子串的匹配场景,再保留fuzz.partial_ratio即可。处理中文名称时,可以先做分词、繁简转换、特殊字符清洗后再计算相似度,结果准确率会明显提升。 - 性能优化:如果数据集行数超过10万,
df.apply的遍历效率较低,可以按分组迭代计算,或者直接用向量化运算替换apply,运行速度可以提升数倍。
结果校验
代码执行后,每个Unique ID分组的最后一行Name2、Score字段均为空值,不会出现不同ID之间的错误匹配问题,输出字段完全符合预期要求。
内容的提问来源于stack exchange,提问作者beginnerprogrammerforever
相关产品推荐
相关产品推荐

