Вопрос, который задавался миллион раз, но я не могу найти правильный ответ, который подходит к моему случаю. У меня есть два 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.