2017-03-04 3 views
1

Ich versuche etwas zu tun, von dem ich denke, dass es ein Einzeiler sein sollte, aber ich kämpfe darum, es richtig zu machen.Pandas: Kleine Datenframes in große zusammenfassen, mit kleinen überschreiben

Ich habe einen großen Datenrahmen, wir nennen ihn lg, und einen kleinen Datenrahmen, nennen wir es sm. Jeder Datenrahmen hat eine start und eine end Spalte, und mehrere andere Spalten , die alle identisch sind zwischen den beiden Datenrahmen (der Einfachheit halber nennen wir alle diese Spalten type). Manchmal haben sm die gleiche startundend als lg, und wenn das der Fall ist, möchte ich sm s type ‚s typelg zu überschreiben‘.

Hier ist das Setup:

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']}) 

... beachten Sie, dass die einzige passende ['start','end'] Combo ['2','6']

Meine gewünschte Ausgabe ist:

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 

Ich habe versucht, mehrere Versionen von .merge() , merge_ordered(), usw., aber ohne Erfolg. Ich habe es tatsächlich mit merge_ordered() und drop_duplicates() arbeiten lassen, nur um zu erkennen, dass es einfach das Duplikat fallen ließ, das früher im Alphabet war, nicht, weil es von sm war.

Antwort

1

können Sie versuchen, start und end Spalten als Index zu setzen und dann combine_first verwenden:

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

enter image description here

+0

wusste ich etwas einfach fehlte. Vielen Dank! – pshep123

+0

Gern geschehen, froh, dass es für Sie funktioniert. – Psidom

Verwandte Themen