两个数据框列之间的相似性

2024-09-30 16:29:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,每个数据帧都有一个名为Song的列。然而,有时歌曲的拼写是不同的。如何使用difflib(或类似的东西)在另一个数据帧的新列中获得一个数据帧的歌曲拼写?在

例如:

Dataframe1

Song           Artist

like a virgi   madonna


Dataframe2

Song          Rank

like a virgin  2


Result

Song            Artist    SongAlt

like a virgin   Madonna   like a virgi

Tags: 数据songartistresult歌曲likevirginrank
1条回答
网友
1楼 · 发布于 2024-09-30 16:29:27

第1步:合并任何可以合并的内容

In [67]: df1
Out[67]: 
           Song    Artist
0        mysong  myartist
1  like a virgi   madonna

In [68]: df2
Out[68]: 
            Song  Rank
0         mysong     1
1  like a virgin     2

In [69]: merged = pd.merge(df1, df2, on='Song')

In [70]: merged
Out[70]: 
     Song    Artist  Rank
0  mysong  myartist     1

第2步:找出剩余的

^{pr2}$

第3步:使用difflib的get_close_matches获得最接近的匹配

^{3}$

第4步:如果需要,获取相似度百分比

In [77]: def similar(a, b):
    ...:     return difflib.SequenceMatcher(None, a, b).ratio()

In [78]: unmerged['Similarity'] = unmerged.apply(lambda row: similar(row['closest_song'], row['Song']), axis=1)

In [79]: unmerged
Out[79]: 
            Song  Rank  closest_song  Similarity
1  like a virgin   2.0  like a virgi        0.96

第5步:使用最接近的值合并

In [80]: unmerged.rename(columns={'Song': 'Old_Song', 'closest_song': 'Song'}, inplace=True)

In [81]: new = unmerged.merge(df1, on='Song')[['Song', 'Artist', 'Rank']]
Out[81]: 
           Song   Artist  Rank
0  like a virgi  madonna   2.0

In [82]: pd.concat([merged, new])
Out[82]: 
           Song    Artist  Rank
0        mysong  myartist   1.0
0  like a virgi   madonna   2.0

相关问题 更多 >