2017-08-31 75 views
3

我有2個數據幀,它們具有相同的列。我想在關鍵列上合併(或連接)這些數據幀,如果兩者之間存在關鍵匹配,它只更新匹配行的單個列,否則它將行附加到第一個/舊數據幀。合併具有條件的兩個數據幀以更新列或追加行

例Psudeocode:

for row in new_dataset: 
if new_dataset['key'] == old_dataset['key']: 
    old_dataset['last_seen'] = new_dataset['last_seen'] 
else: 
    append row to old_dataset 

示例輸入:

DF1

Key  First_Seen Last_Seen Data Data 
Bigfoot 2015  2015  Blah Blah 
Loch_Ness 2016  2016  Blah Blah 
UFO  2016  2004  Blah Blah 

DF2

Key  First_Seen Last_Seen Data Data 
UFO  2017  2017  Blah Blah 
Tupac  2017  2017  Blah Blah 

所需的輸出:

DF3

Key  First_Seen Last_Seen Data Data 
Bigfoot 2015  2015  Blah Blah 
Loch_Ness 2016  2016  Blah Blah 
UFO  2016  2017  Blah Blah 
Tupac  2017  2017  Blah Blah 

編輯:我試過幾種方法,包括:與主要的指標加入,做一個合併右上顯式調用列鍵,然後合併留給追加非匹配值。我面臨的問題是合併要麼合併所有列,要麼創建一個完全重複的df,要麼當我顯式調用列時,它不允許匹配熊貓系列的數據框。當我向正常化上使用列呼叫2系列中,我也沒有辦法恢復回其匹配合並具體的行等

+0

'pd.concat'然後'drop_duplicate' – Wen

+0

這並不適當地更新first_seen和last_seen列,而且會有數據丟失 – itotallyforgot

+0

歡迎堆棧溢出,@itotallyforgot。對於那些希望爲您提供答案的人來說,這可能會有所幫助,從而知道您已經嘗試了什麼,以及它如何無法正常工作。 – Degan

回答

2

新建答案

df1.append(df2).pipe(
    lambda d: (
     lambda f: f('Key').assign(
      Last_Seen=f('Key', 'last').Last_Seen.values) 
    )(d.drop_duplicates) 
).reset_index(drop=True) 

     Key First_Seen Last_Seen Data Data.1 
0 Bigfoot  2015  2015 Blah Blah 
1 Loch_Ness  2016  2016 Blah Blah 
2  UFO  2016  2017 Blah Blah 
3  Tupac  2017  2017 Blah Blah 


lambdamerge

df1.merge(df2, 'outer', 'Key', suffixes=['', '_']).pipe(
    lambda d: d.fillna(
     d.filter(regex='_$').rename(columns=lambda x: x[:-1]) 
    ).assign(Last_Seen=d.Last_Seen_.fillna(d.Last_Seen)) 
)[df1.columns].astype(df1.dtypes) 

     Key First_Seen Last_Seen Data Data.1 
0 Bigfoot  2015  2015 Blah Blah 
1 Loch_Ness  2016  2016 Blah Blah 
2  UFO  2016  2017 Blah Blah 
3  Tupac  2017  2017 Blah Blah 

老回答

d1, d2 = df1.set_index('Key').align(df2.set_index('Key')) 
d3 = d1.combine_first(d2) 
d3.update(d2.Last_Seen) 
d3 = d3.reset_index().astype(df1.dtypes) 
d3 

     Key First_Seen Last_Seen Data Data.1 
0 Bigfoot  2015  2015 Blah Blah 
1 Loch_Ness  2016  2016 Blah Blah 
2  Tupac  2017  2017 Blah Blah 
3  UFO  2016  2017 Blah Blah 
+0

就是這樣。理想情況下,我不想創建第三個數據框,因爲前兩個數據框已經相當大,但我已經測試了幾次,看起來效果很好。謝謝!我現在也可以看到,當我嘗試使用combine_first時,也會將其搞亂。 – itotallyforgot

+0

如果您有興趣,我提供了一個不同的答案。 – piRSquared

+0

我會做一些比較測試與大型數據集,並讓你知道他們如何執行 – itotallyforgot

相關問題