如何用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
相关产品推荐
相关产品推荐

