python - 试图匹配一个 df 中的一列名称,它们可能是另一个 df 列的完全或部分匹配?
问题描述
目标:如果第 i 行 df2 中的名称是第 N 行中 df1 中名称的子字符串或完全匹配,并且 df1 中第 N 行的州和地区列与相应的州和地区列匹配df2 第 i 行,合并。
数据框输入的细分:
- df1 是一个时间序列样式的数据框。
- df2 是一个常规数据框。3.df1和df2的长度不同。
- df1 名称包含首字母、头衔,甚至是奇怪的字符编码。
- 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 Jason Lewis 2 民主党 MN 2 Jasson Lewis Sr. 共和党 MN
第 11 行,索引 3 3 VA 10 True Barbara Comstock 10 VA 10 Barbara Comstock 民主党 VA
解决方案
我们可以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 中查找类似的字符串。这是Name
df1 中的新列的样子:
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
推荐阅读
- r - 如何根据列的值对观察值重新编号
- javascript - 如何将 HTML/JS 小部件包含到 reactjs?
- java - 我正在尝试插入 sql 但它不断给我错误
- android - 如何在所有单选按钮可以交互的每个项目中使用一个单选按钮创建 Android RecyclerView?
- android - 共享元素转换后 Gif 不播放。滑翔 v 4.8.0
- javascript - 使用 pwa angular 在 ios 中打开新选项卡/窗口
- php - 如何修复此错误“无法将要求解析为可安装的软件包集。”
- opencv - 检测物体上的光反射的最可靠方法是什么
- ocr - 使用 pytesseract 加速 OCR
- google-cloud-firestore - Google Cloud Firestore - 如何对数组项进行 OR 查询