2017-03-04 48 views
1

我正在嘗試做一些我認爲應該是單行程式的東西,但我正在努力做正確的事。熊貓:將小型數據框合併爲大型,用小型覆蓋

我有一個很大的數據框,我們將其稱爲lg,以及一個小數據框,我們將其稱爲sm。每個數據幀有一個start和一個end列,以及多個其他列,它們在兩個數據幀(爲了簡單起見,我們將調用所有這些列type)之間是相同的。有時候,sm將具有相同startendlg,如果是這樣的話,我想smtype覆蓋lgtype

這裏的設置:

lg = pd.DataFrame({'start':[1,2,3,4], 'end':[5,6,7,8], 'type':['a','b','c','d']}) 
sm = pd.DataFrame({'start':[9,2,3], 'end':[10,6,11], 'type':['e','f','g']}) 

...請注意,只有匹配['start','end']組合是['2','6']

我想要的輸出:

start end type 
0  1 5 a 
1  2 6 f # where sm['type'] overwrites lg['type'] because of matching ['start','end'] 
2  3 7 c 
3  3 11 g # where there is no overwrite because 'end' does not match 
4  4 8 d 
5  9 10 e # where this row is added from sm 

我試過的.merge()多個版本,merge_ordered()等,但無濟於事。實際上,我已經將它與merge_ordered()drop_duplicates()配合使用,僅僅意識到它只是刪除了字母表中較早的副本,而不是因爲它來自sm

回答

1

你可以嘗試設置startend列的索引,然後使用combine_first

sm.set_index(['start', 'end']).combine_first(lg.set_index(['start', 'end'])).reset_index() 

enter image description here

+0

知道我失去了一些東西簡單。謝謝! – pshep123

+0

不客氣,很高興它適合你。 – Psidom