объединение новых данных со старыми данными путем замены старых данных при добавлении новых строк

#python #pandas

#python #pandas

Вопрос:

У меня есть 2 фрейма данных с одинаковыми именами столбцов. Старый фрейм данных old_df и новый фрейм данных new_df с 1 столбцом в качестве ключа.

Я пытаюсь объединить 2 фрейма данных в один фрейм данных, который соответствует условиям.

  1. Если в новой таблице отсутствует ключ, то следует использовать данные из old_df
  2. если ключ отсутствует в старой таблице, то следует добавить данные из new_df .
  3. Если ключ присутствует в обеих таблицах, то данные из new_df должны перезаписывать данные из old_df .

Ниже приведен мой фрагмент кода, с которым я пытаюсь поиграть.

 new_data = pd.read_csv(filepath)
new_data.set_index(['Name'])
old_data = pd.read_sql_query("select * from dbo.Details", con=engine)
old_data.set_index(['Name'])
merged_result = pd.merge(new_data[['Name','RIC','Volatility','Sector']],
                         old_data,
                         on='Name',
                         how='outer')
  

Я подумываю об использовании np.where с этого момента, но не уверен, как поступить. пожалуйста, дайте совет.

Ответ №1:

Я считаю, что вам нужно DataFrame.combine_first с DataFrame.set_index для сопоставления по Name столбцам:

 merged_result = (new_data.set_index('Name')[['RIC','Volatility','Sector']]
                 .combine_first(old_data.set_index('Name'))
                 .reset_index())
  

Пример данных:

 old_data = pd.DataFrame({'RIC':range(6),
                         'Volatility':[5,3,6,9,2,4], 
                         'Name':list('abcdef')})

print (old_data)
   RIC  Volatility Name
0    0           5    a
1    1           3    b
2    2           6    c
3    3           9    d
4    4           2    e
5    5           4    f

new_data = pd.DataFrame({'RIC':range(4),
                         'Volatility':[10,20,30, 40], 
                         'Name': list('abhi')})

print (new_data)
   RIC  Volatility Name
0    0          10    a
1    1          20    b
2    2          30    h
3    3          40    i
  

 merged_result = (new_data.set_index('Name')
                 .combine_first(old_data.set_index('Name'))
                 .reset_index())
print (merged_result)
  Name  RIC  Volatility
0    a  0.0        10.0
1    b  1.0        20.0
2    c  2.0         6.0
3    d  3.0         9.0
4    e  4.0         2.0
5    f  5.0         4.0
6    h  2.0        30.0
7    i  3.0        40.0
  

Комментарии:

1. Это был отличный ответ. Это сработало как шарм. Я потратил гораздо больше времени на понимание pandas и функций, которые он предоставляет.

Ответ №2:

Ответ @ jezrael выглядит хорошо. Вы также можете попробовать разделить набор данных по условиям и объединить старые и новые фреймы данных. В следующем примере я беру col1 в качестве индекса и получаю результаты, соответствующие правилам объединения в вашем вопросе.

 import pandas as pd
old_data = {'col1': ['a', 'b', 'c', 'd', 'e'], 'col2': ['A', 'B', 'C', 'D', 'E']}
new_data = {'col1': ['a', 'b', 'e', 'f', 'g'], 'col2': ['V', 'W', 'X', 'Y', 'Z']}
old_df = pd.DataFrame(old_data)
new_df = pd.DataFrame(new_data)
  

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

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

Теперь,

 df = pd.concat([new_df, old_df[~old_df['col1'].isin(new_df['col1'])]], axis=0).reset_index(drop=True)
  

Что дает нам

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

Надеюсь, это поможет.