如何在pandas中通过模糊匹配重命名并合并相似的分类值?
Pandas自动合并相似分类的实现方案
核心思路是通过命名规则匹配/字符串相似度计算+自动聚类完成归组,不需要提前遍历所有分类名称。
方案1:下划线分隔命名快速归组(匹配你的示例场景)
如果你的分类名均采用「前缀_后缀」的下划线分隔命名规则,可直接提取首个分词作为统一分类名,代码实现最简单:
# 提取所有唯一分类 unique_cats = df['你的分类列名'].unique() # 生成分类映射字典,取首个分词为标准名 cat_mapping = {cat: cat.split('_')[0] for cat in unique_cats} # 替换原列分类 df['你的分类列名'] = df['你的分类列名'].map(cat_mapping)
直接执行后你示例中的3d、3d_platformer、3d_vision会自动统一为3d。
方案2:公共前缀匹配归组
如果分类名没有统一分隔符,但同类分类多为相同前缀延伸,可按固定前缀长度归组:
from collections import defaultdict unique_cats = df['你的分类列名'].unique().tolist() prefix_len = 2 # 可根据分类命名调整前缀长度,比如2个字符、3个字符 group_dict = defaultdict(list) for cat in unique_cats: # 统一转小写避免大小写导致的分组错误 prefix = cat[:prefix_len].lower() if len(cat)>=prefix_len else cat.lower() group_dict[prefix].append(cat) # 生成分组映射,每组取长度最短的分类作为标准名 cat_mapping = {} for group_cats in group_dict.values(): standard_name = min(group_cats, key=len) for cat in group_cats: cat_mapping[cat] = standard_name df['你的分类列名'] = df['你的分类列名'].map(cat_mapping)
方案3:通用相似度聚类归组
如果分类命名没有明显规则,只是拼写/语义相似,可通过字符串相似度+聚类自动归组:
- 先安装依赖库:
pip install fuzzywuzzy python-Levenshtein scikit-learn - 实现代码:
from fuzzywuzzy import fuzz import numpy as np from sklearn.cluster import DBSCAN unique_cats = df['你的分类列名'].unique().tolist() cat_num = len(unique_cats) # 1. 生成两两分类的相似度距离矩阵 dist_matrix = np.zeros((cat_num, cat_num)) for i in range(cat_num): for j in range(cat_num): # fuzz.ratio返回0-100的相似度得分,转成距离值越小越相似 dist_matrix[i][j] = 100 - fuzz.ratio(unique_cats[i], unique_cats[j]) # 2. DBSCAN自动聚类,eps为距离阈值,越小分组越细 # eps=30代表相似度>=70的分类会被归为同一组,可根据需求调整 clustering = DBSCAN(eps=30, min_samples=1, metric='precomputed').fit(dist_matrix) # 3. 生成映射字典 cat_mapping = {} for cluster_id in set(clustering.labels_): cluster_cats = [unique_cats[idx] for idx, label in enumerate(clustering.labels_) if label == cluster_id] # 取每组长度最短的分类作为标准名,也可自定义为出现频次最高的分类名 standard_name = min(cluster_cats, key=len) for cat in cluster_cats: cat_mapping[cat] = standard_name df['你的分类列名'] = df['你的分类列名'].map(cat_mapping)
注意:可根据你的分类重合度调整eps阈值,重合度高就调小eps避免误合并,重合度低就调大eps提升召回率。
内容的提问来源于stack exchange,提问作者Mackenzie Unger
相关产品推荐
相关产品推荐

