Pandas: ошибка ключа при попытке объединить два фрейма данных

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть две таблицы Excel (Master amp; Input) с одним и тем же столбцом индекса, но с разным количеством столбцов (см. Ниже). Я хочу объединить входной DF с основным DF, если были добавлены новые строки (см. ID 103-105) ИЛИ элемент во входном DF был обновлен (см. ID 102). Другие столбцы можно игнорировать.

Фрейм данных 1 (мастер):

Master DF

Фрейм данных 2 (ввод):

Введите DF

Цель (обновленные ячейки отмечены желтым цветом):

введите описание изображения здесь

Я использую следующий скрипт:

 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])