首页 > 解决方案 > Python pandas,用已知列表中最接近的字符串匹配替换数据框列中的所有元素

问题描述

我有一个数据框,其中列中的值是经常拼错的字符串,例如:

col01 | col02 | name
-----------------------
 ---  |  ---  |  mrk 
 ---  |  ---  |  anth3n7 
 ---  |  ---  |  j4ck 

以及该列可能的正确值列表

possible_names = ['mark', 'anthony', 'jack']

我想查看“名称”列的元素,并从正确名称列表中获取最接近的匹配项,这样我最终会得到:

col01 | col02 | name      |   correct_name
-----------------------------------------
 ---  |  ---  |  mrk      |       mark
 ---  |  ---  |  anth3n7  |      anthony
 ---  |  ---  |  j4ck     |       jack

我尝试使用此代码:

df_names = pd.read_csv('names/wrong.csv')
possible_names = ['mark', 'anthony', 'jack']
df_names['correct_name'] = difflib.get_close_matches(df_names['name'], possible_names)

但我得到了错误:

ValueError: Length of values (0) does not match length of index (3)

标签: pythonpandasdifflib

解决方案


利用:

import difflib

import pandas as pd

df = pd.DataFrame(data=["mrk", "anth3n7", "j4ck"], columns=["name"])
possible_names = ['mark', 'anthony', 'jack']

df["correct_name"] = df["name"].apply(lambda x: difflib.get_close_matches(x, possible_names)[0])
print(df)

输出

      name correct_name
0      mrk         mark
1  anth3n7      anthony
2     j4ck         jack

作为替代方案.apply,您可以使用列表推导:

df["correct_name"] = [difflib.get_close_matches(name, possible_names)[0] for name in df["name"]]

更新

对于不匹配的情况,一种方法是使用:

possible_names = ['anthony', 'jack']
df["correct_name"] = [next(iter(difflib.get_close_matches(name, possible_names)), name) for name in df["name"]]
print(df)

输出

      name correct_name
0      mrk          mrk
1  anth3n7      anthony
2     j4ck         jack

推荐阅读