python - 使用 Python 如何合并两列并仅在另一列中的数据存在时覆盖一列中的数据?

标签 python pandas

我正在尝试合并一些数据,但无法获得我一直在寻找的结果。我有两个数据框,每个数据框有两列:CID 和 Notional。 DF1 有每个 CID,而 DF2 只有部分 CID。我想获取 DF2 的数据并将其与 DF1 合并,以便如果 DF2 的数据存在,它将覆盖 DF1,如果不存在,DF1 将保留其数据。

我尝试过使用 pd.merge,最后我得到了一个包含列 CID、Notional_X、Notional_Y 的 DataFrame;我试过“更新”,但它只是替换了所有旧的 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]})

(不是合并将 CID 25 减少到 0,这是在 df2 中找到的,没有改变任何其他东西)

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

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

这似乎在不合并数据的情况下合并了数据帧(它只是在末尾附加了一列)

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

在你的情况下,当连接的左右表也有相同的数据列(“Notional”)不是合并键(“CID”)的一部分时,合并函数中没有方法决定将哪个值用于 Notional。

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

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

关于python - 使用 Python 如何合并两列并仅在另一列中的数据存在时覆盖一列中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51530054/

相关文章:

sql-server - 在将 python 3.5 与 pandas 和 sqlalchemy 一起使用时,尝试从 csv 文件在 SQL Server 2016 中创建新数据库表时出错

python - Flask:操纵 View 参数的首选方式?

python - SQLAlchemy 批量插入空列

python - 如何在自定义 Django 表单中隐藏 Django 标签?

python - 从 Excel 多表文件 : List comprehension between columns 解析

python - 具有多索引的 Groupby

python - 获取索引错误 : string index out of range

python - gensim TransformedCorpus 数据到数组的高效转换

python - 集群上的 Pandas 和 Spark

python - Pandas 中的轴是什么意思?