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

如何在Pandas中为相似字符串生成分组列?及代码错误修复

问题解决与替代方案

一、修正thefuzz代码的错误

你遇到的NameError是因为未导入fuzz模块,同时原代码的extractOne仅能获取单个最相似结果,不符合收集所有相似字符串的需求。修正步骤如下:

  1. 正确导入模块:
import pandas as pd
from thefuzz import fuzz, process
  1. 改写逻辑,筛选所有符合相似度阈值的字符串(阈值可根据实际需求调整,这里以80为例):
d = {'product_name': ['2 pack liner socks', '2 pack logo liner socks', 'b.bare Hipster', 'Lady BARE Hipster Panty'], 'id': [13, 12, 11, 10]}
df = pd.DataFrame(data=d)

def get_similar_names(name, names_list, threshold=80):
    # 计算当前名称与所有名称的相似度,筛选符合阈值的结果
    similar = [n for n in names_list if fuzz.partial_ratio(name, n) >= threshold]
    return similar

df['group'] = df['product_name'].apply(lambda x: get_similar_names(x, df['product_name'].tolist()))

运行后即可得到你期望的group列结果。

二、替代解决方案:基于TF-IDF与余弦相似度的分组

若不想依赖thefuzz,可使用sklearn的文本特征提取+相似度计算实现:

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

d = {'product_name': ['2 pack liner socks', '2 pack logo liner socks', 'b.bare Hipster', 'Lady BARE Hipster Panty'], 'id': [13, 12, 11, 10]}
df = pd.DataFrame(data=d)

# 生成TF-IDF特征矩阵
vectorizer = TfidfVectorizer(lowercase=True)
tfidf_matrix = vectorizer.fit_transform(df['product_name'])

# 计算余弦相似度矩阵
cos_sim = cosine_similarity(tfidf_matrix)

# 筛选相似度高于阈值的结果(阈值设为0.5,可调整)
def get_similar_group(idx, sim_matrix, names, threshold=0.5):
    similar_indices = [i for i, sim in enumerate(sim_matrix[idx]) if sim >= threshold]
    return [names[i] for i in similar_indices]

df['group'] = [get_similar_group(i, cos_sim, df['product_name'].tolist()) for i in range(len(df))]

该方法适合处理大规模文本数据,通过文本特征数值化衡量相似度。

三、简单关键词匹配方案(适合规则明确的场景)

如果产品名称有明确的共同关键词,可直接用字符串包含逻辑实现,效率更高:

import pandas as pd

d = {'product_name': ['2 pack liner socks', '2 pack logo liner socks', 'b.bare Hipster', 'Lady BARE Hipster Panty'], 'id': [13, 12, 11, 10]}
df = pd.DataFrame(data=d)

def get_group_by_keyword(name):
    name_lower = name.lower()
    if 'liner socks' in name_lower:
        return [n for n in df['product_name'] if 'liner socks' in n.lower()]
    elif 'hipster' in name_lower:
        return [n for n in df['product_name'] if 'hipster' in n.lower()]
    else:
        return [name]

df['group'] = df['product_name'].apply(get_group_by_keyword)

此方案需提前明确分组规则,灵活性较差,但执行速度最快。

内容的提问来源于stack exchange,提问作者AlSub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:05:33