猿问

是否有可能与蟒蛇熊猫进行模糊匹配?

是否有可能与蟒蛇熊猫进行模糊匹配?

我有两个DataFrame,我想根据一个列合并它们。然而,由于交替拼写,不同的空格数目,没有/存在的指示符号,我希望能够合并,只要它们是相似的另一个。


任何相似算法都可以(Soundex,Levenshtein,Difflib)。


假设一个DataFrame具有以下数据:


df1 = DataFrame([[1],[2],[3],[4],[5]], index=['one','two','three','four','five'], columns=['number'])


       number

one         1

two         2

three       3

four        4

five        5


df2 = DataFrame([['a'],['b'],['c'],['d'],['e']], index=['one','too','three','fours','five'], columns=['letter'])


      letter

one        a

too        b

three      c

fours      d

five       e

然后我想要得到最终的DataFrame


       number letter

one         1      a

two         2      b

three       3      c

four        4      d

five        5      e


蝴蝶不菲
浏览 608回答 3
3回答

鸿蒙传说

您可以申请difflib氏get_close_matches到df2的索引,然后应用join:In&nbsp;[23]:&nbsp;import&nbsp;difflib&nbsp; In&nbsp;[24]:&nbsp;difflib.get_close_matchesOut[24]:&nbsp;<function&nbsp;difflib.get_close_matches>In&nbsp;[25]:&nbsp;df2.index&nbsp;=&nbsp;df2.index. map(lambda&nbsp;x:&nbsp;difflib.get_close_matches(x,&nbsp;df1.index)[0])In&nbsp;[26]:&nbsp;df2Out[26]:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;letter one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a two&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b three&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c four&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d five&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eIn&nbsp;[31]:&nbsp;df1.join(df2)Out[31]:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;letter one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a two&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b three&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c four&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d five&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e如果这些是列,则同样可以应用于该列。merge:df1 = DataFrame([[1,'one'],[2,'two'],[3,'three'],[4,'four'],[5,'five']], columns=['number', 'name'])df2 = DataFrame([['a','one'],['b','too'],['c','three'],['d','fours'],['e','five']], columns=['letter', 'name'])df2['name'] = df2['name'].apply(lambda x: difflib.get_close_matches(x, df1['name'])[0])df1.merge(df2)

翻过高山走不出你

这就是我和贾洛-温克勒一起做这件事的方法水母一揽子:def&nbsp;get_closest_match(x,&nbsp;list_strings): &nbsp;&nbsp;best_match&nbsp;=&nbsp;None &nbsp;&nbsp;highest_jw&nbsp;=&nbsp;0 &nbsp;&nbsp;for&nbsp;current_string&nbsp;in&nbsp;list_strings: &nbsp;&nbsp;&nbsp;&nbsp;current_score&nbsp;=&nbsp;jellyfish.jaro_winkler(x,&nbsp;current_string) &nbsp;&nbsp;&nbsp;&nbsp;if(current_score&nbsp;>&nbsp;highest_jw): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;highest_jw&nbsp;=&nbsp;current_score &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best_match&nbsp;=&nbsp;current_string&nbsp;&nbsp;return&nbsp;best_match df1&nbsp;=&nbsp;pandas.DataFrame([[1],[2],[3],[4],[5]],&nbsp;index=['one','two','three','four','five'],&nbsp; columns=['number'])df2&nbsp;=&nbsp;pandas.DataFrame([['a'],['b'],['c'],['d'],['e']],&nbsp; index=['one','too','three','fours','five'],&nbsp;columns=['letter'])df2. index&nbsp;=&nbsp;df2.index.map(lambda&nbsp;x:&nbsp;get_closest_match(x,&nbsp;df1.index))df1.join(df2)产出:&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;&nbsp;letter one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;a two&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;b three&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;c four&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;d five&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;e
随时随地看视频慕课网APP

相关分类

Python
我要回答