通过在附加新行的同时替换旧数据,将新数据合并为旧数据

时间:2019-04-08 04:44:57

标签: 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,但不确定如何进行。请指教。

2 个答案:

答案 0 :(得分:1)

我相信您需要DataFrame.combine_firstDataFrame.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 :(得分:1)

@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: enter image description here

new_df: enter image description here

现在

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

哪个给了我们

df: enter image description here

希望这会有所帮助。