首页 > 解决方案 > 试图匹配一个 df 中的一列名称,它们可能是另一个 df 列的完全或部分匹配?

问题描述

目标:如果第 i 行 df2 中的名称是第 N 行中 df1 中名称的子字符串或完全匹配,并且 df1 中第 N 行的州和地区列与相应的州和地区列匹配df2 第 i 行,合并。

数据框输入的细分:

  1. df1 是一个时间序列样式的数据框。
  2. df2 是一个常规数据框。3.df1和df2的长度不同。
  3. df1 名称包含首字母、头衔,甚至是奇怪的字符编码。
  4. df2 名称只是名字、空格和姓氏的组合。

我的尝试集中在考虑 1. 名称、地区和州。

我的方法试图考虑到 df1 中的名字有首字母或第二名、头衔等,而 df2 只是名字和姓氏。我尝试使用 str.contains('A-za-z') 来解释这种差异。

# Data Frame Samples

# Data Frame 1
CandidateName = ['Theodorick A. Bland','Aedanus Rutherford Burke','Jason Lewis','Barbara  Comstock','Theodorick Bland','Aedanus Burke','Jason Initial Lewis', '','']
State = ['VA', 'SC', 'MN','VA','VA', 'SC', 'MN','NH','NH']
District = [9,2,2,10,9,2,2,1,1]
Party = ['','', '','Democrat','','','Democrat','Whig','Whig']
data1 = {'CandidateName':CandidateName, 'State':State, 'District':District,'Party':Party }
df1 = pd.DataFrame(data = data1)

print df1

#        CandidateName                District   Party             State
#0  Theodorick A. Bland           9                       VA
#1  Aedanus Rutherford Burke      2                       SC
#2  Jason Lewis                   2         Democrat          MN
#3  Barbara Comstock          10        Democrat          VA
#4  Theodorick Bland          9                       VA
#5  Aedanus Burke                 2                       SC
#6  Jason Initial Lewis           2         Democrat          MN
#7  ''                            1         Whig          NH
#8  ''                            1         Whig          NH

Name = ['Theodorick Bland','Aedanus Burke','Jason Lewis', 'Barbara Comstock']
State = ['VA', 'SC', 'MN','VA']
District = [9,2,2,10]
Party = ['','', 'Democrat','Democrat']
data2 = {'Name':Name, 'State':State, 'District':District, 'Party':Party}
df2 = pd.DataFrame(data = data2)

print df2

#   CandidateName        District   Party      State
#0  Theodorick Bland    9           VA
#1  Aedanus Burke           2           SC
#2  Jason Lewis             2   Democrat    MN
#3  Barbara Comstock    10  Democrat    VA
# Attempt code
df3 = df1.merge(df2, left_on = (df1.State, df1.District,df1.CandidateName.str.contains('[A-Za-z]')), right_on=(df2.State, df2.District,df2.Name.str.contains('[A-Za-z]')))

我包括合并地区和州,以减少冗余和不准确。当我从 left_on 和 right_on 中删除区域和州时,输出 df3 的大小并没有增加很多错误匹配。

示例包括 CandidateName 和 Name 是两个不同的人:

Theodorick A. Bland 与 Jasson Lewis Sr. 同排。

上面尝试代码的一些行结果如下:

标题 key_0 key_1 key_2 CandidateName District_x Party_x State_x District_y Name Party_y State_y 第 6 行,索引 4 MN 2 True J​​ason Lewis 2 民主党 MN 2 Jasson Lewis Sr. 共和党 MN

第 11 行,索引 3 3 VA 10 True Barbara Comstock 10 VA 10 Barbara Comstock 民主党 VA

标签: pythonregexpandaspython-2.7

解决方案


我们可以difflib为此创建一个人工key column来合并。我们将此列name称为df2

import difflib
df1['Name'] = df1['CandidateName'].apply(lambda x: difflib.get_close_matches(x, df2['Name'])[0])
df_merge = df1.merge(df2.drop('Party', axis=1), on=['Name', 'State', 'District'])

print(df_merge)
              CandidateName State  District     Party              Name
0       Theodorick A. Bland    VA         9            Theodorick Bland
1          Theodorick Bland    VA         9            Theodorick Bland
2  Aedanus Rutherford Burke    SC         2               Aedanus Burke
3             Aedanus Burke    SC         2               Aedanus Burke
4               Jason Lewis    MN         2                 Jason Lewis
5       Jason Initial Lewis    MN         2  Democrat       Jason Lewis
6         Barbara  Comstock    VA        10  Democrat  Barbara Comstock

difflib.get_close_matches解释。它在 df2 中查找类似的字符串。这是Namedf1 中的新列的样子:

print(df1)
              CandidateName State  District     Party              Name
0       Theodorick A. Bland    VA         9            Theodorick Bland
1  Aedanus Rutherford Burke    SC         2               Aedanus Burke
2               Jason Lewis    MN         2                 Jason Lewis
3         Barbara  Comstock    VA        10  Democrat  Barbara Comstock
4          Theodorick Bland    VA         9            Theodorick Bland
5             Aedanus Burke    SC         2               Aedanus Burke
6       Jason Initial Lewis    MN         2  Democrat       Jason Lewis

推荐阅读