Обновите фрейм данных из другого фрейма данных, но только в том случае, если значения изменились

#pandas #dataframe

Вопрос:

Основываясь на предыдущих ответах, я не могу найти решение своей проблемы. Я кое-как добрался туда, но сейчас я просто немного застрял..

У меня есть два кадра данных:

 df_master = pd.DataFrame({'Reference_Code':['19860', '20220'],  'Price_Now':[249.99, 149.99],  'Price_Was':['',159.99],  'In_Stock':['',''],  'Updated':['',''],   })  df_master Reference_Code Price_Now Price_Was In Stock Updated 19860 249.99  20220 149.99 159.99  df_output = pd.DataFrame({'Reference_Code':['19860', '20220', '52458','12546'],   'Price_Now':[249.99, 149.99, 12.99, 19.99],   'Price_Was':['',159.99,'',''],   'Updated':['30/10/2021','','',''],  })    df_output Reference_Code Price_Now Price_Was Updated 19860 259.99 30/10/2021 20220 149.99 159.99 52458 12.99 12546 19.99  

Я хочу, чтобы результат в df_master был таким, как показано ниже (я буду добавлять новые записи отдельно).:

 df_master Reference_Code Price_Now Price_Was Updated 19860 259.99 30/10/2021 20220 149.99 159.99  

Шаги, которые, я думаю, мне нужны для достижения этой цели:

Шаг 1 Создайте новый фрейм данных под названием df_match, показывающий строки в df_master, которые соответствуют df_output на основе [‘Reference_Code’], используя следующий код

 code1= list(df_master['Reference_Code']) df_match = df_output.loc[df_output['Reference_Code'].isin(code1)]  

Шаг 2 Удалите строки, в df_match которых значение df_match['Price_Now'] равно df_output['Price_Now'] . Это оставит фрейм данных только с теми значениями, в которых есть обновленное/другое значение df_output['Price_Now'] .

Шаг 3 Используйте оставшиеся элементы в df_match качестве элементов для обновления df_master , обновите значения, df_master['Price_Now'] используя значение из df_output['Price_Now']

Шаг 4 В то же время используйте оставшиеся элементы df_match для обновления df_master['Updated'] с помощью переменной « todaysdate

Любые советы о моем подходе и о том, как этого добиться, будут оценены по достоинству.

Заранее спасибо.

Ответ №1:

Один из возможных подходов заключается в следующем:

 df_master_redux = df_master.drop(['In_Stock'], axis = 1) df_ouput = pd.concat([df_master_redux, df_output]).reset_index() df_ouput = df_ouput.drop_duplicates() df_ouput = df_ouput.sort_values(['Reference_Code']).groupby('Reference_Code').tail(1).drop(['index'], axis=1)  

который возвращает:

 Reference_Code Price_Now Price_Was Updated 5 12546 19.99  2 19860 249.99 30/10/2021 1 20220 149.99 159.99  4 52458 12.99