¿Cómo puedo combinar dos marcos de datos de pandas en dos columnas con nombres diferentes y mantener una de las columnas?
df1 = pd.DataFrame({'UserName': [1,2,3], 'Col1':['a','b','c']}) df2 = pd.DataFrame({'UserID': [1,2,3], 'Col2':['d','e','f']}) pd.merge(df1, df2, left_on='UserName', right_on='UserID')
Esto proporciona un DataFrame como este
Pero claramente me estoy fusionando con UserName
y UserID
para que sean iguales. Quiero que se vea así. ¿Hay alguna forma limpia de hacer esto?
Solo las formas en que puedo pensar son cambiar el nombre de las columnas para que sean las mismas antes de fusionar, o eliminar una de ellas después de fusionar. Sería bueno si los pandas soltaran automáticamente uno de ellos o podría hacer algo como
pd.merge(df1, df2, left_on='UserName', right_on='UserID', keep_column='left')
¿Qué tal si configura el UserID
como índice y luego únase en el índice para el segundo dataframe?
pd.merge(df1, df2.set_index('UserID'), left_on='UserName', right_index=True) # Col1 UserName Col2 # 0 a 1 d # 1 b 2 e # 2 c 3 f
No hay nada realmente bueno en esto: está destinado a mantener las columnas, ya que los casos más grandes como la izquierda derecha o las combinaciones externas aportan información adicional con dos columnas. No intente forzar en exceso su línea de fusión, sea explícito como sugiere
Solución 1:
df2.columns = ['Col2', 'UserName'] pd.merge(df1, df2,on='UserName') Out[67]: Col1 UserName Col2 0 a 1 d 1 b 2 e 2 c 3 f
Solución 2:
pd.merge(df1, df2, left_on='UserName', right_on='UserID').drop('UserID', axis=1) Out[71]: Col1 UserName Col2 0 a 1 d 1 b 2 e 2 c 3 f