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

У меня есть 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 с этого момента, но не знаю, как поступить. пожалуйста посоветуй.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я считаю, что вам нужно 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

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

Alok 08.04.2019 09:48

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

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)

старый_дф:

new_df:

Сейчас,

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

Что дает нам

ДФ:

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

Другие вопросы по теме