我正在尝试合并一些数据,但无法获得我一直在寻找的结果。我有两个带有两列的数据框: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')
这似乎是合并数据帧而不合并数据(它只是在末尾追加一列)
任何帮助将不胜感激。谢谢。
答案 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。
答案 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)