Tengo 3 archivos CSV. Cada uno tiene la primera columna como los nombres (de cadena) de las personas, mientras que todas las demás columnas en cada marco de datos son atributos de esa persona.
¿Cómo puedo "unir" los tres documentos CSV para crear un único CSV con cada fila que tenga todos los atributos para cada valor único del nombre de la cadena de la persona?
La join()
función en pandas especifica que necesito un índice múltiple, pero estoy confundido acerca de qué tiene que ver un esquema de indexación jerárquica con una unión basada en un índice único.
df1.join([df2, df3], on=[df2_col1, df3_col1])
no funcionó.Respuestas:
Importaciones supuestas:
La respuesta de John Galt es básicamente una
reduce
operación. Si tengo más de un puñado de marcos de datos, los pondría en una lista como esta (generada a través de comprensiones de listas o bucles o cualquier otra cosa):Suponiendo que tengan alguna columna común, como
name
en su ejemplo, haría lo siguiente:De esa manera, su código debería funcionar con cualquier cantidad de marcos de datos que desee fusionar.
Editar 1 de agosto de 2016 : para aquellos que usan Python 3:
reduce
se ha movido afunctools
. Entonces, para usar esta función, primero deberá importar ese módulo:fuente
reduce
fue reemplazado porfunctools.reduce
Soimport functools functools.reduce(.......)
name1
,name2
yname3
respectivamente.n-1
llamadas a la función de fusión? Supongo que en este caso donde el número de marcos de datos es pequeño, no importa, pero me pregunto si hay una solución más escalable.df
correos electrónicos con múltiples índices de columna (estaba inyectando el 'on' como una columna que funcionó para la primera fusión, pero las fusiones posteriores fallaron), en cambio conseguí que funcionara con:df = reduce(lambda left, right: left.join(right, how='outer', on='Date'), dfs)
Puedes probar esto si tienes 3 marcos de datos
alternativamente, como lo menciona cwharland
fuente
df1.merge(df2,on='name').merge(df3,on='name')
name1
,name2
yname3
respectivamentedf1.merge(df2,left_on='name1', right_on='name2').merge(df3,left_on='name1', right_on='name3').drop(columns=['name2', 'name3']).rename(columns={'name1':'name'})
Esta es una situación ideal para el
join
método.El
join
método está construido exactamente para este tipo de situaciones. Puede unir cualquier número de DataFrames junto con él. El DataFrame de llamada se une con el índice de la colección de DataFrames aprobados. Para trabajar con múltiples DataFrames, debe colocar las columnas de unión en el índice.El código se vería así:
Con los datos de @ zero, puede hacer esto:
fuente
pd.DataFrame().join(dfs, how="outer")
. Esto puede ser más limpio en algunas situaciones.pd.concat
dará lugar a la sintaxis más simple:pd.concat([df.set_index('name') for df in dfs], axis=1, join='inner').reset_index()
.concat
también es más versátil cuando se trata de nombres de columna duplicados en múltiples dfs (join
no es tan bueno en esto) aunque solo puede realizar uniones internas o externas con él.dfs[0].join(dfs[1:])
debe editarsedfs[0].join(dfs[1:], sort=False)
porque de lo contrarioFutureWarning
aparecerá una ventana emergente. Gracias por el buen ejemplo.ValueError: Indexes have overlapping values
aunque, al inspeccionar los marcos de datos individuales en la lista, no parecen tener valores superpuestos.Esto también se puede hacer de la siguiente manera para obtener una lista de marcos de datos
df_list
:o si los marcos de datos están en un objeto generador (por ejemplo, para reducir el consumo de memoria):
fuente
En
python
3.6.3 conpandas
0.22.0 también puede usarconcat
siempre que establezca como índice las columnas que desea usar para la unióndonde
df1
,df2
ydf3
se definen como en la respuesta de John Galtfuente
No se necesita un índice múltiple para realizar operaciones de unión . Uno solo necesita establecer correctamente la columna de índice en la que realizar las operaciones de unión (qué comando,
df.set_index('Name')
por ejemplo)La
join
operación se realiza por defecto en el índice. En su caso, solo tiene que especificar que laName
columna corresponde a su índice. Debajo hay un ejemploUn tutorial puede ser útil.
fuente
Aquí hay un método para fusionar un diccionario de marcos de datos mientras se mantienen sincronizados los nombres de las columnas con el diccionario. También completa los valores faltantes si es necesario:
Esta es la función para fusionar un dict de marcos de datos
OK, permite generar datos y probar esto:
fuente
Solución simple:
Si los nombres de las columnas son similares:
Si los nombres de las columnas son diferentes:
fuente
Hay otra solución de la documentación de pandas (que no veo aquí),
utilizando la
.append
Se
ignore_index=True
utiliza para ignorar el índice del marco de datos adjunto, reemplazándolo con el siguiente índice disponible en el origen.Si hay diferentes nombres de columna,
Nan
se introducirá.fuente
Los tres marcos de datos son
Combinemos estos marcos usando pd.merge anidado
Aquí vamos, tenemos nuestro marco de datos combinado.
Feliz análisis !!!
fuente