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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:09:33