VLOOKUP в Python Pandas

Вопросы и ответы

Вопрос, который задавался миллион раз, но я не могу найти правильный ответ, который подходит к моему случаю. У меня есть два excel файла, которые я хочу объединить, как в VLOOKUP Excel.

Файл A уже содержит созданные столбцы, и они частично заполнены (или пустые). Есть один столбец с адресами, который будет использоваться как объединяющий столбец для другого Excel файла, Файла B. Однако в Файле A больше адресов, чем в Файле B, поэтому Файл B будет заполнять целевые столбцы на основе значений для этих адресов, остальные не должны быть затронуты (либо оставаться пустыми, либо с их старым значением).

Файл B содержит этот столбец с адресами, а затем столбцы со значениями, которые должны быть назначены соответствующим адресам в Файле A. В Файле B есть и другие столбцы, но я не хочу их в Файле A.

Согласно моим исследованиям, мне нужно выполнить Левое Внутреннее Соединение для достижения этого. Общий столбец — AdressID, столбцы для объединения назовем их AA, BB, CC и DD.

Мои датафреймы называются dfFileA и dfFileB.

Я попробовал следующий код:

dfFileA = pd.merge(dfFileA[['AA', 'BB', 'CC', 'AdressID']], dfFileB[['AA', 'BB', 'CC', 'AdressID']], on=['AdressID'], how='left')

Сообщение об ошибке:
KeyError: “[‘AA’, ‘BB’, ‘CC’] not in index”

Где ошибка?

Большое спасибо!

[ИСПРАВЛЕНИЕ:]
Вот пример моей проблемы, однако здесь создаются новые столбцы с одинаковыми именами, но заканчивающиеся на _y, и переименовываются оригинальные столбцы, заканчивающиеся на _x (я не знаю, почему это происходит в этом примере, а не в оригинальном файле):

import pandas as pd
FileA = {
'AA' : ['', 'DEF', '', 'JKL'],
'BB' : ['MNO', '', 'STU', ''],
'CC' : ['WX', '', 'GDG', 'GJ'],
'AdressID' : ['Great Street 1', 'Amazing Street 5', 'Perfect Street 21', 'Fantastic Street 88']
}

FileB = {
'AA' : ['ABC', '', 'GHI', ''],
'BB' : ['', 'PQR', '', 'FAS'],
'CC' : ['', 'YZ', '', 'GJ'],
'AdressID' : ['Great Street 1', 'Amazing Street 5', 'Perfect Street 21', 'Fantastic Street 88']
}

dfFileA = pd.DataFrame(FileA)
dfFileB = pd.DataFrame(FileB)

print(dfFileA)
print(dfFileB)

merged = pd.merge(dfFileA, dfFileB, on='AdressID', how='inner')
print(merged)

Очевидно, я хочу получить вывод, как

merged = {
'AA' : ['ABC', 'DEF', 'GHI', 'JKL'],
'BB' : ['MNO', 'PQR', 'STU', 'FAS'],
'CC' : ['WX', 'YZ', 'GDG', 'GJ'],
'AdressID' : ['Great Street 1', 'Amazing Street 5', 'Perfect Street 21', 'Fantastic Street 88']
}

Надеюсь, это поможет лучше

Код

Используйте combine_first, вместо merge

out = dfFileA.replace('', None).combine_first(dfFileB)

out:

    AA   BB   CC             AdressID
0  ABC  MNO   WX       Great Street 1
1  DEF  PQR   YZ     Amazing Street 5
2  GHI  STU  GDG    Perfect Street 21
3  JKL  FAS   GJ  Fantastic Street 88

Ответ

Конечно! Давайте разберёмся, как выполнить задачу, подобную VLOOKUP в Excel, используя библиотеку pandas в Python. Поскольку вы хотите объединить два DataFrame на основе общего столбца (AdressID) и при этом сохранить существующие данные в первом DataFrame, вам нужно использовать метод, который не просто объединяет данные, а также позволяет сохранить старые значения.

Вот подробное решение вашей задачи на основе вашего примера:

Шаг 1: Импортируйте необходимые библиотеки

import pandas as pd

Шаг 2: Создайте ваши DataFrame

Создаем два DataFrame, как было указано в вашем вопросе.

FileA = {
    'AA': ['', 'DEF', '', 'JKL'],
    'BB': ['MNO', '', 'STU', ''],
    'CC': ['WX', '', 'GDG', 'GJ'],
    'AdressID': ['Great Street 1', 'Amazing Street 5', 'Perfect Street 21', 'Fantastic Street 88']
}

FileB = {
    'AA': ['ABC', '', 'GHI', ''],
    'BB': ['', 'PQR', '', 'FAS'],
    'CC': ['', 'YZ', '', 'GJ'],
    'AdressID': ['Great Street 1', 'Amazing Street 5', 'Perfect Street 21', 'Fantastic Street 88']
}

dfFileA = pd.DataFrame(FileA)
dfFileB = pd.DataFrame(FileB)

Шаг 3: Объедините DataFrame с использованием combine_first

Теперь мы будем использовать метод combine_first, чтобы объединить DataFrame. Этот метод заменяет пустые значения в одном DataFrame значениями из другого DataFrame только там, где это необходимо.

# Заменяем пустые строки на None для правильной обработки
dfFileA = dfFileA.replace('', None)

# Объединяем DataFrame
result = dfFileA.combine_first(dfFileB)

Шаг 4: Вывод результата

Распечатаем результат, чтобы увидеть, как выглядят объединенные данные.

print(result)

Ожидаемый вывод

После выполнения кода вы получите следующий DataFrame:

    AA   BB   CC             AdressID
0  ABC  MNO   WX       Great Street 1
1  DEF  PQR   YZ     Amazing Street 5
2  GHI  STU  GDG    Perfect Street 21
3  JKL  FAS   GJ  Fantastic Street 88

Пояснение

  • Метод replace('', None) заменяет пустые строки на None, так как None считается отсутствием значения и позволяет корректно работать с combine_first.
  • Метод combine_first берет значения из dfFileB и заполняет пустые значения в dfFileA. Таким образом, если в dfFileA уже есть значения, они сохранятся, а если есть пустые значения, то они будут заменены на данные из dfFileB.

Таким образом, вы успешно достигли цели, аналогичной VLOOKUP в Excel, с помощью Python и pandas.

Оцените материал
Добавить комментарий

Капча загружается...