如何用Python中另一个DataFrame对象中的值更新DataFrame对象的一部分?

如何用Python中另一个DataFrame对象中的值更新DataFrame对象的一部分?,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧对象: obj1: obj2: 我想更新保持列header1和header2中的值的obj1,并将列header3和header4设置为obj2中的值 例如: header1 header2 header3 header4 1 A someValue9 someValue13 2 B someValue10 someValue14 3 C some

我有两个数据帧对象:

obj1:

obj2:

我想更新保持列
header1
header2
中的值的
obj1
,并将列
header3
header4
设置为
obj2
中的值

例如:

header1    header2    header3      header4
1          A          someValue9   someValue13
2          B          someValue10  someValue14
3          C          someValue11  someValue15
4          D          someValue10  someValue16
我试过的是:

for ID in obj2.header2:
    obj1[obj1.header1==ID].header3 = obj2[obj2.header1==ID].header3
    obj1[obj1.header1==ID].header4 = obj2[obj2.header1==ID].header4
但是,这并没有改变
obj1
中的任何内容,它仍然与前面的代码相同

有没有一个很好的方法来实现我的目标

请注意,这些示例是抽象的,实际的
ID
(AKA
header1
)在
obj1
obj2
中可能不匹配。所以有些ID不需要更新。例如,
obj1
的ID为1,2,3,4,5,
obj2
的ID为2,3,4,5。因此,不必更新
obj1
中的ID 1

非常感谢。

您可以使用和:

解决方案包括,以及:


你好,谢谢你的回答。但是,在我的例子中,一些ID不需要更新。有什么好办法吗?非常感谢。我想我不明白。你是说有些值是相同的,所以不需要更新吗?有点像这样,例如,我在
obj1
中有ID:1、2、3、4、5,而在
obj2
中,ID是2、3、4、5。在这种情况下,只有
obj1
中的2、3、4、5在
obj2
中有相应的记录可供使用。因此,只有ID 2、3、4、5在
obj1
中得到更新。能否将其添加到问题和所需输出中<代码>ID是否为
索引
?这个信息在问题中丢失了。嗨,耶兹雷尔。谢谢我已经更新了我的问题。实际上,
ID
不是索引,而是
header1
header1    header2    header3      header4
1          A          someValue9   someValue13
2          B          someValue10  someValue14
3          C          someValue11  someValue15
4          D          someValue10  someValue16
for ID in obj2.header2:
    obj1[obj1.header1==ID].header3 = obj2[obj2.header1==ID].header3
    obj1[obj1.header1==ID].header4 = obj2[obj2.header1==ID].header4
print obj1
   ID header2      header3      header4
0   1       A   someValue1   someValue5
1   2       B   someValue2   someValue6
2   3       C   someValue3   someValue7
3   4       D   someValue4   someValue8
4   5      D1  someValue41  someValue81

print obj2
   ID header2      header3      header4
0   2       E   someValue9  someValue13
1   3       F  someValue10  someValue14
2   4       G  someValue11  someValue15
3   5       H  someValue10  someValue16



df = pd.merge(obj1, obj2, on=['ID'], suffixes=['_l', ''], how='left').combine_first(obj1)
print df
   ID header2 header2_l      header3    header3_l      header4    header4_l
0   1       A         A   someValue1   someValue1   someValue5   someValue5
1   2       E         B   someValue9   someValue2  someValue13   someValue6
2   3       F         C  someValue10   someValue3  someValue14   someValue7
3   4       G         D  someValue11   someValue4  someValue15   someValue8
4   5       H        D1  someValue10  someValue41  someValue16  someValue81

df = df[['ID','header2','header3','header4']]
print df
   ID header2      header3      header4
0   1       A   someValue1   someValue5
1   2       E   someValue9  someValue13
2   3       F  someValue10  someValue14
3   4       G  someValue11  someValue15
4   5       H  someValue10  someValue16
mask = obj1.ID.isin(obj2.ID.tolist())
print mask
0    False
1     True
2     True
3     True
4     True
Name: ID, dtype: bool

obj1.loc[mask, obj1.columns] = obj2.values
print obj1
   ID header2      header3      header4
0   1       A   someValue1   someValue5
1   2       E   someValue9  someValue13
2   3       F  someValue10  someValue14
3   4       G  someValue11  someValue15
4   5       H  someValue10  someValue16