Python 基于匹配值从不同的数据帧更新数据帧

Python 基于匹配值从不同的数据帧更新数据帧,python,pandas,Python,Pandas,我有两个数据帧,DF1(33,92)和DF2(11,18),我想根据两个DFs中列名“ID”的匹配值将DF2 18列复制到DF1,这18列在两个数据帧中具有相同的名称 我使用了以下合并:finaldf=pd.merge(DF1,DF2,on='ID',how='left') 除了更改了DF1中的18列名称并添加了另外18列之外,这一切都很好。因此,最终的数据帧形状是(33109),而它假定具有DF1形状(3392),但具有更新的行。合并后的finaldf具有形状(33109),因为它具有具有类似

我有两个数据帧,DF1(33,92)和DF2(11,18),我想根据两个DFs中列名“ID”的匹配值将DF2 18列复制到DF1,这18列在两个数据帧中具有相同的名称

我使用了以下合并:
finaldf=pd.merge(DF1,DF2,on='ID',how='left')


除了更改了DF1中的18列名称并添加了另外18列之外,这一切都很好。因此,最终的数据帧形状是(33109),而它假定具有DF1形状(3392),但具有更新的行。

合并后的
finaldf
具有形状(33109),因为它具有具有类似名称的列,但附加了
\ux
\uy
<代码>\ux来自DF1
\uy
来自DF2

您需要在合并后运行以下代码,以删除这18个字段的额外“\x”和“\y”列,并将值从DF2复制到DF1,它们在“ID”上匹配:


有关合并数据框中出现“\x”和“\y”列的原因的更多信息,我建议您检查一下
pd.dataframe.merge的官方方法。
“_x”和“_y”是默认情况下,merge操作添加的后缀,用于区分具有相似名称的列


或者:

pd.DataFrame.update
是pandas中的一种方法,用于实现您正在尝试的操作

看看吧。但是使用它有一个警告,那就是如果在DF2中有NaN值要复制到DF1,那么它不会这样做。它将仅更新
非NA
值:

使用其他数据帧中的非NA值就地修改


如果您只想从DF2获得这18列的值(比如col1、col2…col18),您可以这样做

cols_18 = ["col1",col2"....]
cols_to_use = list(set(DF1.columns) - set(cols_18))
pd.merge(DF1[cols_to_use],DF2...), on = 'ID', how ='left')
如果要保留两个数据帧中的列,默认后缀为x和y。但是你可以像下面这样覆盖它们

pd.merge(DF1,DF2...), on = 'ID', how ='left, suffixes = ["","_new"])

现在将有109列,但主数据框的列名保持不变。DF2中的列的后缀为“\u new”

如果DF1中的“ID”是“index”列,则我们无法达到此要求,因为我们不能有两行具有相同的索引ID。请查看“合并”。如果两个dfs中有相同的列名,Merge方法将添加后缀,以区分它们。您可以稍后重命名/删除额外的。这是否回答了您的问题?但此方法仅从DF2获取这18列的值,因此“ID”列不匹配的行,这些行在这18列中将具有NAN。如果我们从DF1中删除18列并获得[cols_to_use],这意味着我们将删除与DF2不匹配的行信息。所以从技术上讲,在基于公共值进行合并之后,我需要DF1中的这些行。我无法准确理解这个问题。您是否可以提供一个大小为2x2的数据帧示例,并展示您想要的内容?感谢您的详细回复,我将尝试一下,但如果我更改DF2中的18列名称,并将它们映射到DF1中相应的18列,以避免名称重复,是否会有所帮助?如果是的话。下面这行行行吗。finaldf=pd.merge(DF1[cols_18],DF2,on='ID',how='left')DF1和DF2中的18个列名已经是相同的,对吗?这就是为什么“x”和“y”通过合并添加。谢谢,对了,如果我更改了DF2列的名称,当它们具有不同的列名称时,我将如何将它们映射回DF1?它是这样工作的吗?嗨,对不起,我没有活动。我不理解你的问题“合并后跳过18列内填充的数据”。如果您有一些新的需求,您想涵盖的场景,您可以随时发布一个新的问题。这样,您将能够更好地解释您的用例。如果你发布它,请告诉我,这将帮助你:)合并后,你的df中没有
finaldf[col]
。这个循环实际上是在创建它。合并后,您有
finaldf[col+''ux']
finaldf[col+''uy']
。现在,
pd.merge
已经负责将ID上匹配的值从DF2复制到DF1。这些值存储在
finaldf[col+''u y']
中。当它们不匹配时,您希望保持DF1的值正确。这就是python行在循环中所做的。在这个过程中,由于您不想在
finaldf
中使用“\x”和“\y”列,我基本上创建了
finaldf['col']
来存储最终数据。您不能在合并的
finaldf
中设置条件。
pd.merge(DF1,DF2...), on = 'ID', how ='left, suffixes = ["","_new"])