Пытаетесь сопоставить столбец имен в одном df, где они могут быть точным или частичным совпадением с другим df 'scolumn? - PullRequest
0 голосов
/ 31 марта 2019

Цель : если имя в df2 в строке i является подстрокой или точно соответствует имени в df1 в некоторой строке N, а столбцы состояния и района строки N в df1 являютсясопоставьте соответствующие столбцы состояния и района строки i df2, объедините.

Разбивка входных данных фрейма данных:

  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Мягкий общий доступ к той же строке, что и у 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

1 Ответ

0 голосов
/ 31 марта 2019

Мы можем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...