Объединение фреймов данных на основе сопоставления подстрок между двумя несопоставимыми столбцами - PullRequest
1 голос
/ 22 января 2020

Моя проблема здесь заключается в соединении двух разнородных полей имени (без очень большого количества исключений) с использованием python / pandas.

У меня есть два кадра данных, где я хотел бы объединить 'short_name' или 'long_name' из df 1 и 'name' из df2.

df 1:

           short_name                            long_name  age  height_cm  \
0            L. Messi       Lionel Andrés Messi Cuccittini   32        170   
1   Cristiano Ronaldo  Cristiano Ronaldo dos Santos Aveiro   34        187   
2           Neymar Jr        Neymar da Silva Santos Junior   27        175   
3            J. Oblak                            Jan Oblak   26        188   
4           E. Hazard                          Eden Hazard   28        175   
5        K. De Bruyne                      Kevin De Bruyne   28        181

df 2:

                      name     2014      2015      2016      2017      2018  \
0             Kylian Mbappé      NaN    0.0570    1.9238   51.3000  175.5600   
1                    Neymar   74.100   98.8000  114.0000  133.0000  205.2000   
2             Mohamed Salah   14.820   17.1000   26.6000   39.9000  144.4000   
3                Harry Kane    3.420   22.8000   41.8000   72.2000  159.6000   
4               Eden Hazard   53.010   74.1000   76.0000   82.6500  143.6400   
5              Lionel Messi  136.800  136.8000  136.8000  136.8000  197.6000 

Я изменил столбец df2 "name", чтобы следовать за ( первый инициал, соглашение о фамилии) столбца df1 'short_name'. К сожалению, это привело ко многим исключениям, поскольку столбец df2 «имя» не всегда следует этому соглашению (примеры включают «Neymar Jr» (ожидается: «Neymar»), Криштиану Роналду (ожидается: C. Ronaldo) и Роберто Фирмино (ожидается: R. Firmino).

Единственное, о чем я могу думать, это использование подстроки. Есть ли способ разбить столбец df2 'name' на отдельные подстроки, а затем посмотреть, содержит ли df1 'long_name' все эти элементы (ie видеть, есть ли у "Lionel Andrés Messi Cuccittini" оба "Lionel" и "Messi" из имени d1 и затем сливаться с ним)?

После поиска некоторое время это не ' Это не похоже на функциональность pandas, поскольку она разбивает его на несколько столбцов. Я также не знаю, могут ли слияния принимать условия, такие как совпадения подстрок. Все, о чем я думал, не касается этих исключений / несоответствий, кроме соответствие подстроки.

Редактировать: Как сказал другой пользователь, возможно, стоит разделить имена на наборы и убедиться, что все подстроки в «name» в df2 находятся в «long_name» в df1. Но я не могу найти способ сделать это, не разбивая строку на отдельные столбцы.

РЕШЕНО: Кажется, что работает, это изолировать и создать копию столбцов (сделать их серии), а затем разделить имена на списки и посмотреть, были ли более короткие имена подмножествами более длинных имен в double для -l oop. Вот мой код:

names = df1['name']
long_names = df2['long_name']

for i in range(len(names)):
    name_list = names[i].split()
    for j in range(len(long_names)):
        long_name_list = long_names[j].split()
        if set(name_list).issubset(long_name_list):
            df2.loc[j, "long_name"] = df1.loc[i, "name"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...