我有两个单独的文件,一个来自我们的服务提供商,另一个是内部(HR)。
服务提供商以不同的方式写出雇主的姓名,有些人以姓氏姓氏格式写出来,或者姓氏的首字母和姓氏或姓氏在一起写……而HR文件分别包括名和姓。
DF1
Full Name
0 B.pitt
1 Mr Nickolson Jacl
2 Johnny, Deep
3 Streep Meryl
DF2
First Last
0 Brad Pitt
1 Jack Nicklson
2 Johnny Deep
3 Streep Meryl
我的想法是使用str.contains查找名字和姓氏的第一个字母。我成功使用以下代码对静态值进行了处理:
df1[['Full Name']][df1['Full Name'].str.contains('B')
& df1['Full Name'].str.contains('pitt')]
哪个给出以下结果:
Full Name
0 B.pitt
挑战在于比较两个数据集...对此有何建议?
致谢
答案 0 :(得分:0)
如果您只是检查它是否存在,则可能有用: 因为很少有两个完全相同的姓氏,所以我建议将Df1分开并比较姓氏,然后再确保您也可以使用不同的姓氏 您可以使用for轻松实现:
for i in range('your index'):
if df1_splitted[i].str.contain('family you searching for'):
print("yes")
如果您需要在其他方面进行比较,请告诉我
答案 1 :(得分:0)
我建议使用下一个模块来解析名称:
pip install nameparser
然后您可以处理数据帧:
from nameparser import HumanName
import pandas as pd
df1 = pd.DataFrame({'Full Name':['B.pitt','Mr Nickolson Jack','Johnny, Deep','Streep Meryl']})
df2 = pd.DataFrame({'First':['Brad', 'Jack','Johnny', 'Streep'],'Last':['Pitt','Nicklson','Deep','Meryl']})
names1 = [HumanName(name) for name in df1['Full Name']]
names2 = [HumanName(str(row[0]+" "+ str(row[1]))) for i,row in df2.iterrows()]
之后,您可以尝试比较已解析了文件的HumanName
个实例。看起来像这样:
<HumanName : [
title: ''
first: 'Brad'
middle: ''
last: 'Pitt'
suffix: ''
nickname: '' ]
我使用这种方法处理了数千个名称,并将它们与其他文档合并为相同的名称,效果很好。
有关模块的更多信息,请访问https://nameparser.readthedocs.io/en/latest/
答案 2 :(得分:0)
嘿,您可以将模糊字符串匹配与fuzzywuzzy
一起使用首先为GeniuzApp
创建全名
df2
然后按索引合并两个数据框
df2_ = df2[['First', 'Last']].agg(lambda a: a[0] + ' ' + a[1], axis=1).rename('Full Name').to_frame()
现在您可以申请merged_df = df2_.merge(df1, left_index=True, right_index=True)
,以便获得相似性
fuzz.token_sort_ratio
这将导致以下数据帧。您现在可以按相似性对其进行过滤或排序。
merged_df['similarity'] = merged_df[['Full Name_x', 'Full Name_y']].apply(lambda r: fuzz.token_sort_ratio(*r), axis=1)