如何用Python中另一个DataFrame对象中的值更新DataFrame对象的一部分?
我有两个数据帧对象: obj1: obj2: 我想更新保持列如何用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
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
(AKAheader1
)在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