使用包含来合并数据框

时间:2019-10-31 12:24:48

标签: python pandas

我有两个单独的文件,一个来自我们的服务提供商,另一个是内部(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

挑战在于比较两个数据集...对此有何建议?

致谢

3 个答案:

答案 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)