2014-10-08 6 views
7

Kann man sich eine LEFT JOIN in Pandas durchführen, die auf der rechten Seite nur das erste Spiel wählt? Beispiel:Kann man sich eine LEFT JOIN in Pandas durchführen, die auf der rechten Seite nur das erste Spiel wählt?

left   = pd.DataFrame() 
left['age']  = [11, 12] 
right   = pd.DataFrame() 
right['age'] = [10, 11, 11] 
right['salary'] = [ 100, 150, 200 ] 
left.merge(right, how='left', on='age') 

Returns

age salary 
0 11  100 
1 11  200 
2 12  NaN 

Aber was würde ich ist wie die Anzahl der Zeilen von links zu bewahren, indem lediglich das erste Spiel nehmen. Das heißt:

age salary 
0 11  100 
2 12  NaN 

Also habe ich

left.merge(right.drop_duplicates(['age']), how='left', on='age') 

mit, aber ich glaube, dass dies eine vollständige Kopie der rechten macht. Und es riecht komisch.

Gibt es einen eleganteren Weg?

+1

Dies würde unkompliziert als Option '' merge'' hinzuzufügen, wird aber zur Zeit nicht umgesetzt. – Jeff

+0

Danke Jeff. Ich werde es anfordern. Wird die Frage hier, falls jemand verlassen kann mir zeigen, wie die Kopie (oder Nebeneffekt) zu vermeiden, in der Zwischenzeit. – Quant

Antwort

1

Ja, können Sie groupby Ihre doppelte Zeilen zu entfernen. Machen Sie alles, was Sie getan haben, um links und rechts zu definieren. Nun definiere ich einen neuen Datenrahmen auf den letzte Zeile:

left2=left.merge(right, how='left', on='age') 
df= left2.groupby(['age'])['salary'].first().reset_index() 
df 

Zuerst habe ich einen · min(), die Ihnen den Mindestgehalt an jedem Alter geben, wie zum Beispiel:

df= left2.groupby(['age'])['salary'].min().reset_index() 

Aber Sie haben speziell nach dem ersten Spiel gefragt. Verwenden Sie dazu die Option .first(). Hinweis: Die .reset_index() am Ende, neu formatiert nur die Ausgabe des groupby wieder ein Datenrahmen zu sein.