如何计算DataFrame中Artist_x与Artist_y列的相似度并生成新列?
计算DataFrame中两列艺术家名称的相似度
没问题,你选difflib的思路完全正确,它里面的SequenceMatcher刚好能搞定字符串相似度计算!我来帮你补全代码,还会加些实用的细节处理:
步骤1:导入必要库
先把需要的工具都引入:
import pandas as pd from difflib import SequenceMatcher
步骤2:实现相似度计算函数
你代码里的similar函数还没定义,我们用SequenceMatcher来写这个核心逻辑——它的ratio()方法会返回0-1的相似度值,乘100就能转成百分比。另外加上空值判断,避免遇到缺失值时报错:
def similar(a, b): # 处理空值:只要有一个是NaN,直接返回0%相似度 if pd.isna(a) or pd.isna(b): return 0.0 # 计算相似度并转成百分比(保留两位小数更直观) return round(SequenceMatcher(None, str(a), str(b)).ratio() * 100, 2)
步骤3:将函数应用到DataFrame
现在就可以用你写的apply逻辑了,把函数传进去就行:
mergednew['SimilarityArtist'] = mergednew.apply(lambda row: similar(row['Artist_x'], row['Artist_y']), axis=1)
额外优化(针对大数据量)
如果你的DataFrame行数很多,普通apply速度可能偏慢,推荐用swifter库加速(先安装:pip install swifter),它会自动判断用普通apply还是向量化方式处理:
import swifter mergednew['SimilarityArtist'] = mergednew.swifter.apply(lambda row: similar(row['Artist_x'], row['Artist_y']), axis=1)
举个测试小例子:
mergednew = pd.DataFrame({ 'Artist_x': ['Taylor Swift', 'Ed Sheeran', 'Billie Eilish'], 'Artist_y': ['Taylor Swift', 'Ed Sheeran Jr.', 'Billie Ellish'] })
运行后SimilarityArtist列会得到:100.0, 85.71, 94.12,完全符合预期~
内容的提问来源于stack exchange,提问作者joe borg
相关产品推荐
相关产品推荐

