Найти строку в столбце в первой таблице по части значения во второй таблице и перенести значение строки во вторую таблицу
Столкнулся со следующей проблемой, которую вторые сутки не могу решить. Есть 2 таблицы.
Таблица 1
tabl1 = pd.DataFrame({'ФИО': ['324Петров Иван Иваныч', 'Стетхем Василий Генадич', '22Иванов Илон Маскович'], 'Дата рождения': ['01.11.1955', '01.01.1965', '01.01.1975']})
И таблица 2
tabl2 = pd.DataFrame({'ФИО': ['Стетхем Василий Генадич', 'Петров Иван Иваныч', 'Иванов Илон Маскович'], 'Место работы': ['Правительство', 'Завод', 'НИИ']})
Необходимо из таблицы 1 перенести значение 'Дата рождения' в таблицу 2, чтобы оно соответствовало (полностью или частично) тому ФИО, которое указано в таблице 2.
Т.е. в итоге должно получиться следующее:
Пытался решить через функцию:
def sopostavim(tabl1, tabl2):
data = ''
if tabl1.str.contains(tabl2['ФИО']) == True:
data = tabl1['Дата рождения']
return data
И многими другими способами, но не смог найти решения. Буду благодарен любым подсказкам)
Ответы (2 шт):
Прямой merge здесь не подойдет, но можно сделать через нахождение нужных индексов. Как-то так:
tabl1 = tabl1.reindex(tabl2["ФИО"]
.apply(lambda x: tabl1.loc[tabl1["ФИО"]
.str.contains(x), "Дата рождения"].index.values[0]).tolist())
tabl2 = tabl2.join(tabl1["Дата рождения"])
получаем tabl2:
ФИО Место работы Дата рождения
0 Стетхем Василий Генадич Правительство 01.11.1955
1 Петров Иван Иваныч Завод 01.01.1965
2 Иванов Илон Маскович НИИ 01.01.1975
как-то громоздко получилось, но на ум ничего лучше не приходит
Если кто-то будет использовать это решение для себя, то можно заюзать следующие костыли:
tabl1 = pd.DataFrame({'ФИО': ['324Петров Иван Иваныч', 'Стетхем Василий Генадич', '22Иванов Илон Маскович'], 'Дата рождения': ['01.11.1955', '01.01.1965', '01.01.1975']})
tabl2 = pd.DataFrame({'ФИО': ['Стетхем Василий Генадич', 'Петров Иван Иваныч', 'Иванов Илон Маскович'], 'Место работы': ['Правительство', 'Завод', 'НИИ']})
Удаляем лишние символы в виде цифр и т.д. из первой таблицы
tabl1['ФИО'] = tabl1['ФИО'].apply(lambda x: re.sub(r'[^\w\s]+|[\d]+', r'', x).strip())
Делаем проверку на наличие таких ФИО во второй таблице относительно первой, дропая лишние (в моем случае так требовалось) и дропаем лишние ФИО из второй таблицы
tabl1 = tabl1.loc[tabl1['ФИО'].isin(tabl2['ФИО'])]
tabl2 = tabl2.loc[tabl2['ФИО'].isin(tabl1['ФИО'])]
tabl1 = tabl1.reset_index(drop=True)
tabl2 = tabl2.reset_index(drop=True)
А дальше выполняем реиндексацию и бахаем нужный столбец во вторую таблицу
tabl1 = tabl1.reindex(tabl2["ФИО"]
.apply(lambda x: tabl1.loc[tabl1["ФИО"]
.str.contains(x), "Дата рождения"].index.values[0]).tolist())
tabl1 = tabl1.reset_index(drop=True)
tabl2 = tabl2.join(tabl1["Дата рождения"])


