2017-10-11 70 views
1

我有這樣一個數據幀,1個數據幀,而其他數據幀具有相同的密鑰

Key Group RS 
42 23 100 
42 41 21 
46 23 89 
67 10 65 

其他數據幀是這樣的更新一列,

Key Group RS 
42 41 11 
67 10 23 

有層次:鍵 - >集團(鑰匙內唯一) - > RS。

如果密鑰和組與第二個數據幀相同,我想要替換第一個數據幀中的RS值。 所以結果應該是像,

Key Group RS 
42 23 100 
42 41 11 // updated 
46 23 89 
67 10 23 // updated 

我想用大熊貓.update功能,但它不能與非唯一索引,這是因爲它在多行重複爲重點的情況下工作。我很困惑該怎麼做。

回答

3

pd.concat + drop_duplicates

pd.concat([df1,df2],0).drop_duplicates(['Key','Group'],keep='last') 
Out[1107]: 
    Key Group RS 
0 42  23 100 
2 46  23 89 
0 42  41 11 
1 67  10 23 
+1

哇這是非常獨特的,簡單的,它運行得比以前更快! :P需要更改已驗證的答案 – Trion

+1

雖然我不得不在最後堆疊一個'.sort_values(by =「Key」)',以使這些鍵合在一起。即使採用這種額外的分類步驟也是如此。 – Trion

+0

@Trion很高興幫忙 – Wen

4

設置索引並使用loc分配更新的值。然後重置索引。
請注意,此方法保留'RS'列的dtype列。

d1 = df1.set_index(cols).RS 
d2 = df2.set_index(cols).RS 
d1.loc[d2.index] = d2 
d1.reset_index() 

    Key Group RS 
0 42  23 100 
1 42  41 11 
2 46  23 89 
3 67  10 23 
3

這裏有一種方法

In [718]: cols = ['Key', 'Group'] 

In [719]: df2.set_index(cols).combine_first(df1.set_index(cols)).reset_index() 
Out[719]: 
    Key Group  RS 
0 42  23 100.0 
1 42  41 11.0 
2 46  23 89.0 
3 67  10 23.0 

詳細

In [720]: df1 
Out[720]: 
    Key Group RS 
0 42  23 100 
1 42  41 21 
2 46  23 89 
3 67  10 65 

In [721]: df2 
Out[721]: 
    Key Group RS 
0 42  41 11 
1 67  10 23 
+0

遺憾,不得不接受的答案切換到另一種,因爲它是更加快速。 – Trion

0

一個解決辦法,你可以考慮的是更新指數(key)是唯一的,然後用你的更新方法提及。另一種方式可能是遍歷這兩個數組,隨時更新,但這並不優雅。

你可以嘗試的另一件事是使用多索引來恢復唯一性。

+0

對不起,不可能改變唯一性,謝謝你給出了答案 – Trion

+0

嗯,假設你做了一個新的列,等於說'10 *鍵+我'你用'我'來區分獨特的事件。 – Charles

相關問題