#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть две таблицы Excel (Master amp; Input) с одним и тем же столбцом индекса, но с разным количеством столбцов (см. Ниже). Я хочу объединить входной DF с основным DF, если были добавлены новые строки (см. ID 103-105) ИЛИ элемент во входном DF был обновлен (см. ID 102). Другие столбцы можно игнорировать.
Фрейм данных 1 (мастер):
Фрейм данных 2 (ввод):
Цель (обновленные ячейки отмечены желтым цветом):
Я использую следующий скрипт:
inputDf = pd.read_excel(inputFileName).set_index("ID")
masterDf = pd.read_excel(masterFileName).set_index("ID")
# Update existing rows
masterDf.update(inputDf)
# find out which ids are new
ids_of_new_rows = set(inputDf.index) - set(masterDf.index)
# get new rows that should be added to master
rows_to_add = masterDf.loc[ids_of_new_rows, inputDf.columns amp; masterDf.columns]
Я могу обновить основной DF и получить ids_of_new_rows
. Вывод:
{'CR103', 'CR104', 'CR105'}
Однако при попытке получить rows_to_add
я всегда получаю следующую ошибку:
KeyError(f"None of [{key}] are in the [{axis_name}]")
KeyError: "None of [Index(['CR103', 'CR104', 'CR105'], dtype='object', name='ID')] are in the [index]"
Есть идеи?
Комментарии:
1. это должно быть rows_to_add = inputDf.loc и т.д. и т.д., Но вы указываете на masterDf там. Вот где ошибка.
2. Спасибо, @SandervandenOord. Какая глупая ошибка.
Ответ №1:
Об ошибке
Ошибка возникает из-за того, что в the есть не строки с ID
of ['CR103', 'CR104', 'CR105']
masterDf
, а в the inputDf
. То, что вы пытаетесь сделать, вероятно,
rows_to_add = inputDf.loc[ids_of_new_rows, inputDf.columns amp; masterDf.columns]
Что вы, вероятно, хотите сделать
inputDf = pd.read_excel(inputFileName).set_index("ID")
masterDf = pd.read_excel(masterFileName).set_index("ID")
# Update existing rows
masterDf.update(inputDf)
# Add new rows
masterDf = pd.concat((masterDf, inputDf.loc[inputDf.index.difference(masterDf.index), inputDf.columns amp; masterDf.columns]))
Здесь Index.difference используется для получения значений индекса в inputDf
, которых нет в masterDf
.
Комментарии:
1. Спасибо. Используя ваше решение, дополнительные столбцы из входного DF также добавляются в основной DF. Их следует игнорировать. Следовательно, правильным решением является использование исправленного
rows_to_add
в операторе concat, например:df_result = pd.concat([masterDf, rows_to_add])
2. О, да, пропустил, из которого вы хотели бы удалить дополнительные столбцы
inputDf
. Обновлен ответ.
Ответ №2:
Вот правильный сценарий для достижения результата, описанного ниже. Простым решением было изменить inputDF и masterDF…
# Define DataFrame
inputDf = pd.read_excel(inputFileName).set_index("ID")
masterDf = pd.read_excel(masterFileName).set_index("ID")
# Update existing rows
masterDf.update(inputDf)
# find out which ids are new
ids_of_new_rows = set(inputDf.index) - set(masterDf.index)
# get new rows that should be added to master
rows_to_add = inputDf.loc[ids_of_new_rows, inputDf.columns amp; masterDf.columns]
# add new rows to existing master
df_result = pd.concat([masterDf, rows_to_add])