Python Pandas: присоединение к регистронезависимому и лишенному ключу

Левый фрейм данных MASTER =

Имя Имя Количество Джон Смит-Ричардс Дэйвид О'Брайен

Правый фрейм данных ORDERS =

Имя Имя Количество ДЭЙВИД ОБРАЙЕН 36 Джон Смит Ричардс 11

Ожидаемый результат Dataframe =

Имя Имя Количество Джон Смит-Ричардс 11 Дэйвид О'Брайен 36

Таблицы MASTER и ORDERS объединяются LEFT-OUTER с помощью KEY = [Fname, Lname]

Обе таблицы имеют одинаковые столбцы, но строки расположены в разном порядке. Я хочу, чтобы операция соединения игнорировала регистр и игнорировала такие символы, как тире, пробелы и апострофы (например, таблицы будут объединены по значениям «johnsmithrichards» и «davidobrien»)

(На практике в реальных таблицах гораздо больше столбцов, и результирующая выходная таблица должна извлечь некоторые значения из таблицы MASTER, а другие — из таблицы ORDERS, поэтому я использовал mdfcols и odfcols соответственно, чтобы включить только эти конкретные столбцы.)

Моя попытка удалить только пробелы не работает:

key = ["Fname", "Lname"]

mdfkey = (mdf["First Name"].str.lower() + mdf["Last Name"].str.lower()).replace(' ', '')
mdfcols = ["Fname", "Lname"]

odfkey = (odf["First Name"].str.lower() + odf["Last Name"].str.lower()).replace(' ', '')
odfCols = ["Amount"]

outputdf = pd.merge(
    mdf.loc[:, mdfcols],
    odf.loc[:, odfCols],
    how='left', left_on=mdfkey, right_on=odfkey)

Создайте новый ключевой столбец в обоих DataFrames, объединив Fname и Lname, преобразуйте их в нижний регистр и удалите unwanted characters. Затем вы можете использовать этот ключевой столбец для выполнения слияния.

Vinod Baste 25.06.2024 07:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте Series.str.replace для удаления небуквенно-цифровых значений для обоих DataFrames, последний вспомогательный столбец удаления key_0:

key = ["Fname", "Lname"]

mdfkey = (mdf["Fname"] + mdf["Lname"]).str.replace('[^a-zA-Z]', '', regex=True).str.lower()
mdfcols = ["Fname", "Lname"]


odfkey = (odf["Fname"] + odf["Lname"]).str.replace('[^a-zA-Z]', '', regex=True).str.lower()
odfCols = ["Amount"]

outputdf = pd.merge(
    mdf.loc[:, mdfcols],
    odf.loc[:, odfCols],
    how='left', left_on=mdfkey, right_on=odfkey).drop('key_0', axis=1)

print (outputdf)
   Fname           Lname  Amount
0   John  Smith-Richards      11
1  David         O'Brien      36

Решение с вспомогательными столбцами:

merging = ['merge']
key = ["Fname", "Lname"]

mdf['merge'] = ((mdf["Fname"] + mdf["Lname"]).str.replace('[^a-zA-Z]', '', regex=True)
                                             .str.lower())
mdfcols = ["Fname", "Lname"]


odf['merge'] = ((odf["Fname"] + odf["Lname"]).str.replace('[^a-zA-Z]', '', regex=True)
                                             .str.lower())
odfCols = ["Amount"]

outputdf = pd.merge(
    mdf.loc[:, mdfcols + merging],
    odf.loc[:, odfCols + merging],
    how='left', on=merging).drop(merging, axis=1)

print (outputdf)
   Fname           Lname  Amount
0   John  Smith-Richards      11
1  David         O'Brien      36

Другие вопросы по теме

Измените форму кадра данных Pandas и сгруппируйте столбцы двух уровней
Python: 3-сигма детектор «аномалий» количества заказов и строк
Как избежать цикла в Pandas, повторяющего уникальные значения?
Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Добавьте значения двух Dataframe на основе похожих значений строк
С помощью Python извлеките в файл Excel значение ячейки в строке, где ячейка в той же строке содержит строку символов из XML-файла
Обмен датой начала, датой окончания и другими столбцами с более ранней строкой, если даты больше 8 в фрейме данных pandas
Как я могу сравнить значение в одном столбце со всеми значениями, которые находятся ДО него в другом столбце, чтобы найти количество уникальных значений, которые меньше?
Присоединиться к фрейму данных с двойной записью
Получите минимум за счет итераций записи в фрейме данных pandas