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

如何用difflib匹配两个DataFrame中拼写不同的Song列内容?

使用difflib匹配DataFrame中存在拼写差异的歌曲名称

这个场景太常见了——处理音乐数据时,拼写错误、缩写或者少打字母的情况经常让两个数据集的歌曲名称对不上。别担心,Python的difflib库正好能帮咱们解决这个字符串相似度匹配的问题,下面就一步步教你实现需求。

首先,先把你的示例数据用Pandas创建出来:

import pandas as pd

# 创建示例DataFrame1
df1 = pd.DataFrame({
    'Song': ['like a virgi'],
    'Artist': ['madonna']
})

# 创建示例DataFrame2
df2 = pd.DataFrame({
    'Song': ['like a virgin'],
    'Rank': [2]
})

接下来,咱们定义一个匹配函数,用difflib.get_close_matches来找到最相似的歌曲名称。这个函数会根据字符串的相似度返回匹配列表,咱们只取最匹配的那一个:

import difflib

def find_matching_song(song_name, target_list, cutoff=0.7):
    # 从目标列表中找最相似的歌曲名
    matches = difflib.get_close_matches(song_name, target_list, n=1, cutoff=cutoff)
    # 如果有匹配项就返回第一个,没有就返回None
    return matches[0] if matches else None

然后,咱们可以把这个函数应用到df1的Song列,去匹配df2里的歌曲名称,生成SongAlt列;之后再把两个DataFrame合并成你想要的结果格式:

# 给df1添加匹配到的df2中的歌曲名
df1['SongAlt'] = df1['Song'].apply(lambda x: find_matching_song(x, df2['Song'].tolist()))

# 合并df1和df2,以匹配到的歌曲名为键
result = pd.merge(df2, df1, left_on='Song', right_on='SongAlt', how='left')

# 调整列顺序,和你的示例结果一致
result = result[['Song', 'Artist', 'SongAlt']]

# 输出结果
print(result)

运行这段代码后,你会得到和示例一致的结果:

Song  Artist      SongAlt
0  like a virgin  madonna  like a virgi

关键参数说明

  • cutoff:这个参数控制相似度阈值,范围是0到1。值越高,要求两个字符串越相似才会匹配。比如你可以调到0.8来过滤掉不太像的匹配,或者调到0.6来包容更多拼写差异。
  • n:设置返回的匹配项数量,这里咱们只需要最匹配的一个,所以设为1。

如果你的数据集很大,difflib的速度可能有点慢,这时候也可以考虑用fuzzywuzzy库(需要额外安装),它的process.extractOne函数也能实现类似的功能,而且速度会快一些。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:15:02