#python #pandas
#python #pandas
Вопрос:
У меня есть 2 фрейма данных с одинаковыми именами столбцов. Старый фрейм данных old_df
и новый фрейм данных new_df
с 1 столбцом в качестве ключа.
Я пытаюсь объединить 2 фрейма данных в один фрейм данных, который соответствует условиям.
- Если в новой таблице отсутствует ключ, то следует использовать данные из
old_df
- если ключ отсутствует в старой таблице, то следует добавить данные из
new_df
. - Если ключ присутствует в обеих таблицах, то данные из
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)
Теперь,
df = pd.concat([new_df, old_df[~old_df['col1'].isin(new_df['col1'])]], axis=0).reset_index(drop=True)
Что дает нам
Надеюсь, это поможет.