Цель : если имя в df2 в строке i является подстрокой или точно соответствует имени в df1 в некоторой строке N, а столбцы состояния и района строки N в df1 являютсясопоставьте соответствующие столбцы состояния и района строки i df2, объедините.
Разбивка входных данных фрейма данных:
- 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Мягкий общий доступ к той же строке, что и у Jasson Lewis Sr.
Некоторые результаты строки с приведенным выше кодом попытки: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