2016-03-07 37 views
2

我拖數據框對象:如何使用Python中另一個DataFrame對象中的值更新DataFrame對象的一部分?

OBJ1:

header1 header2 header3  header4 
1   A   someValue1 someValue5 
2   B   someValue2 someValue6 
3   C   someValue3 someValue7 
4   D   someValue4 someValue8 

OBJ 2:

header1 header2 header3  header4 
1   E   someValue9 someValue13 
2   F   someValue10 someValue14 
3   G   someValue11 someValue15 
4   H   someValue10 someValue16 

我想更新obj1是守在列header1header2的值,並設置列header3header4obj2中的值。

例如:

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)可能不是1對1 obj1obj2匹配。所以一些ID不需要更新。例如,obj1具有ID 1,2,3,4,5,並且obj2具有ID 2,3,4,5。因此obj1中的ID 1不一定要更新。

非常感謝。

回答

1

您可以使用mergecombine_first

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 

解決方案與isinlocvalues

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 
+0

您好,謝謝您的回答。但是,就我而言,一些ID不需要更新。有沒有一個乾淨的方式來做到這一點?非常感謝。 – ChangeMyName

+0

我想我不明白。你的意思是一些值是相同的,所以更新沒有必要? – jezrael

+0

這樣的排序,例如,我有ID:1,2,3,4,5在'obj1'和'obj2'中的ID是2,3,4,5。在這種情況下,只有2, 'obj1'中的3,4,5在'obj2'中有相應的記錄來使用。因此,只有ID 2,3,4,5在'obj1'中被更新。 – ChangeMyName

相關問題