使用fuzzywuzzy计算pandas分组内字符串与组首字符串的相似度
实现方案
假设你使用pandas处理结构化数据集,可直接通过分组取首行参考值、批量计算相似度的逻辑实现需求,具体代码如下:
首先导入依赖库:
import pandas as pd from fuzzywuzzy import fuzz
基础实现(小数据集适用)
# 1. 为每个unit分组生成组内共享的首行参考字符串列 df['group_ref_str'] = df.groupby('unit')['Vector_string'].transform('first') # 2. 逐行计算当前字符串与组首参考串的相似度 df['similarity'] = df.apply( lambda row: fuzz.token_sort_ratio(row['Vector_string'], row['group_ref_str']), axis=1 ) # 3. 生成match_index字段,组首行值为0,其余行按组内顺序递增(如果不需要递增可直接统一设为0) df['match_index'] = df.groupby('unit').cumcount() # 可选:删除临时生成的参考串列 df.drop('group_ref_str', axis=1, inplace=True)
优化实现(大数据集适用)
如果数据量较大,逐行apply性能偏低,可通过预存分组参考值字典优化性能:
# 预存每个unit对应的首行参考字符串 unit_ref_map = df.groupby('unit')['Vector_string'].first().to_dict() # 直接通过字典映射取参考串计算相似度 df['similarity'] = df.apply( lambda row: fuzz.token_sort_ratio(row['Vector_string'], unit_ref_map[row['unit']]), axis=1 ) df['match_index'] = df.groupby('unit').cumcount()
效果验证
上述实现中每组首行的Vector_string与参考串完全一致,因此相似度固定为100,match_index固定为0,组内其余所有行仅与本组首行比对,不会出现组内两两比对的情况,完全匹配需求。
内容的提问来源于stack exchange,提问作者Serge de Gosson de Varennes
相关产品推荐
相关产品推荐

