У меня есть 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
с этого момента, но не знаю, как поступить. пожалуйста посоветуй.
Я считаю, что вам нужно 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
Ответ @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)
Сейчас,
df = pd.concat([new_df, old_df[~old_df['col1'].isin(new_df['col1'])]], axis=0).reset_index(drop=True)
Что дает нам
Надеюсь это поможет.
Это был отличный ответ. Оно работало завораживающе. Я потратил гораздо больше времени на изучение панд и функций, которые они предоставляют.