Найти строку в столбце в первой таблице по части значения во второй таблице и перенести значение строки во вторую таблицу

Рейтинг: 2Ответов: 2Опубликовано: 21.01.2023

Столкнулся со следующей проблемой, которую вторые сутки не могу решить. Есть 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

как-то громоздко получилось, но на ум ничего лучше не приходит

▲ 0

Если кто-то будет использовать это решение для себя, то можно заюзать следующие костыли:

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["Дата рождения"])