Fusionar dos conjuntos de datos en Pandas

Anteriormente he trabajado con Stata y ahora estoy tratando de hacer lo mismo con Python. Sin embargo, tengo problemas con el comando de combinación. De alguna manera debo estar perdiendo algo. Mis dos marcos de datos que quiero fusionar se ven así:

df1: Date id Market_Cap 2000 1 400 2000 2 200 2001 1 410 2001 2 220 df2: id Ticker 1 Shell 2 ExxonMobil 

Mi objective ahora es obtener el siguiente conjunto de datos:

 Date id Market_Cap Ticker 2000 1 400 Shell 2000 2 200 ExxonMobil 2001 1 410 Shell 2001 2 220 ExxonMobil 

Probé el siguiente comando:

 merged= pd.merge(df1, df2, how="left", on="id") 

Esto fusiona los conjuntos de datos, pero me da solo el nan en la columna de Ticker. Miré varias fonts y tal vez me equivoque, pero ¿no es el comando de la “izquierda” lo correcto para mi propósito? También intenté “derecha” y “exterior”. No consiguen el resultado que quiero y “interno” no parece funcionar aquí en general.

¿Me estoy perdiendo algo crucial?

El problema es que su id columna en un df es un object (obviamente, una string ) y otro int , por lo que no hay coincidencia y se obtiene NaN .

Si tienen los mismos dtypes :

 print (df1['id'].dtypes) int64 print (df2['id'].dtypes) int64 merged = pd.merge(df1, df2, how="left", on="id") print (merged) Date id Market_Cap Ticker 0 2000 1 400 Shell 1 2000 2 200 ExxonMobil 2 2001 1 410 Shell 3 2001 2 220 ExxonMobil 

Otra solución si es necesario agregar solo una nueva columna es map :

 df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker']) print (df1) Date id Market_Cap Ticker 0 2000 1 400 Shell 1 2000 2 200 ExxonMobil 2 2001 1 410 Shell 3 2001 2 220 ExxonMobil 

Simule su problema:

 print (df1['id'].dtypes) object print (df2['id'].dtypes) int64 df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker']) print (df1) Date id Market_Cap Ticker 0 2000 1 400 NaN 1 2000 2 200 NaN 2 2001 1 410 NaN 3 2001 2 220 NaN 

Y la solución se convierte a int por astype (o id columna en df2 a str ):

 df1['id'] = df1['id'].astype(int) #alternatively #df2['id'] = df2['id'].astype(str) df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker']) print (df1) Date id Market_Cap Ticker 0 2000 1 400 Shell 1 2000 2 200 ExxonMobil 2 2001 1 410 Shell 3 2001 2 220 ExxonMobil