使用Python,如何合并两列并仅在另一列中存在数据的情况下才覆盖一列中的数据?

时间:2018-07-26 02:15:16

标签: python pandas

我正在尝试合并一些数据,但无法获得我一直在寻找的结果。我有两个带有两列的数据框:CID和名义。 DF1具有每个CID,DF2仅具有一些CID。我想获取DF2的数据并将其与DF1合并,以便如果DF2的数据存在,它将覆盖DF1,否则,DF1将保留其数据。

我尝试使用pd.merge,最后得到一个DataFrame,它具有列CID,Notional_X,Notional_Y;我尝试过“更新”,但它只会替换所有旧的DataFrame数据。

以下是我要寻找的示例:

#Example of Data (couldn't find a better way to explain this)
df1 = pd.DataFrame({'CID':[1,25,100], 'Notional': [1000, 2500, 5500]})
df2 = pd.DataFrame({'CID':[25], 'Notional': [0]})

输出将返回一个如下所示的DataFrame:

pd.DataFrame({'CID': [1,25,100], 'Notional': [1000,0,5500]})

(不是合并将df2中的CID 25降低为0,而未进行任何其他更改)

文档表明,“合并”应该完成它,但它只是……没有。

test = df1.merge(df1, df2, how = 'left', on = 'CID')

这似乎是合并数据帧而不合并数据(它只是在末尾追加一列)

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

在您的情况下,如果联接的左表和右表都具有不属于合并键(“ CID”)的一部分的相同数据列(“名义”),则合并功能中没有方法决定用于名义的值。

您可以再添加一行代码来解决此问题。

import pandas as pd
import numpy as np

# make the data
df1 = pd.DataFrame({'CID':[1,25,100], 'Notional': [1000, 2500, 5500]})
df2 = pd.DataFrame({'CID':[25], 'Notional': [0]})

# merge the data
test = df1.merge(df2, how='left', on='CID')

# If Notional from df2 was not missing,  then use it,  else use df1's Notional
test['Notional'] = np.where(test['Notional_y'].isna(), test['Notional_x'], test['Notional_y'])

然后您可以从数据框中删除Notional_x和Notional_y,保留新创建的Notional。

enter image description here

答案 1 :(得分:1)

尝试一下。

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'CID':[1,25,100], 'Notional': [1000, 2500, 5500]})
df2 = pd.DataFrame({'CID':[25], 'Notional2': [0]})

df=pd.merge(df1,df2,how='left')

df['Notional'] = np.where(df['Notional2'].isna(),df['Notional'],df['Notional2'])

df.drop('Notional2',axis=1)