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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:45:04