python - tutorial - recorrer data frame pandas
Las pandas combinan dos marcos de datos con columnas diferentes (2)
Seguramente me estoy perdiendo algo simple aquí. Intentar combinar dos marcos de datos en pandas que tienen en su mayoría los mismos nombres de columna, pero el marco de datos correcto tiene algunas columnas que la izquierda no tiene, y viceversa
>df_may
id quantity attr_1 attr_2
0 1 20 0 1
1 2 23 1 1
2 3 19 1 1
3 4 19 0 0
>df_jun
id quantity attr_1 attr_3
0 5 8 1 0
1 6 13 0 1
2 7 20 1 1
3 8 25 1 1
He intentado unir con una unión externa:
mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer")
Pero eso da lugar a:
Left data columns not unique: Index([....
También he especificado una sola columna para unir (on = "id", por ejemplo), pero duplica todas las columnas excepto "id" como attr_1_x, attr_1_y, lo cual no es ideal. También he pasado la lista completa de columnas (hay muchas) a "on":
mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values))
Cuyos rendimientos:
ValueError: Buffer has wrong number of dimensions (expected 1, got 2)
¿Qué me estoy perdiendo? Me gustaría obtener un df con todas las filas agregadas, y attr_1, attr_2, attr_3 se rellenen donde sea posible, NaN donde no se muestren. Esto parece un flujo de trabajo bastante típico para el intercambio de datos, pero estoy atascado.
Gracias por adelantado.
Creo que en este caso concat
es lo que quieres:
In [12]:
pd.concat([df,df1], axis=0, ignore_index=True)
Out[12]:
attr_1 attr_2 attr_3 id quantity
0 0 1 NaN 1 20
1 1 1 NaN 2 23
2 1 1 NaN 3 19
3 0 0 NaN 4 19
4 1 NaN 0 5 8
5 0 NaN 1 6 13
6 1 NaN 1 7 20
7 1 NaN 1 8 25
al pasar axis=0
aquí, usted está apilando los df uno encima del otro, lo que creo que es lo que desea y luego produce un valor NaN
donde están ausentes de sus respectivos dfs.
Tuve este problema hoy usando cualquiera de concat, append o merge, y lo resolví agregando una columna auxiliar numerada secuencialmente y luego haciendo una combinación externa
helper=1
for i in df1.index:
df1.loc[i,''helper'']=helper
helper=helper+1
for i in df2.index:
df2.loc[i,''helper'']=helper
helper=helper+1
df1.merge(df2,on=''helper'',how=''outer'')