Моя проблема здесь заключается в соединении двух разнородных полей имени (без очень большого количества исключений) с использованием 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"]