pandas uniendo tres vías múltiples marcos de datos en columnas

Resuelto lollercoaster asked hace 10 años • 12 respuestas

Tengo 3 archivos CSV. Cada uno tiene la primera columna como los nombres (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 en el que cada fila tenga todos los atributos para cada valor único del nombre de 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 la realización de una combinación basada en un único índice.

lollercoaster avatar May 15 '14 09:05 lollercoaster
Aceptado

La respuesta de Zero es básicamente una reduceoperación. Si tuviera más de un puñado de marcos de datos, los pondría en una lista como esta (generada mediante listas por comprensión o bucles o cualquier otra cosa):

dfs = [df0, df1, df2, ..., dfN]

Suponiendo que tengan una columna común, como nameen su ejemplo, haría lo siguiente:

import functools as ft
df_final = ft.reduce(lambda left, right: pd.merge(left, right, on='name'), dfs)

De esa manera, su código debería funcionar con cualquier cantidad de marcos de datos que desee fusionar.

Kit avatar May 28 '2015 17:05 Kit

Podrías probar esto si tienes 3 marcos de datos.

# Merge multiple dataframes
df1 = pd.DataFrame(np.array([
    ['a', 5, 9],
    ['b', 4, 61],
    ['c', 24, 9]]),
    columns=['name', 'attr11', 'attr12'])
df2 = pd.DataFrame(np.array([
    ['a', 5, 19],
    ['b', 14, 16],
    ['c', 4, 9]]),
    columns=['name', 'attr21', 'attr22'])
df3 = pd.DataFrame(np.array([
    ['a', 15, 49],
    ['b', 4, 36],
    ['c', 14, 9]]),
    columns=['name', 'attr31', 'attr32'])

pd.merge(pd.merge(df1,df2,on='name'),df3,on='name')

alternativamente, como lo menciona cwharland

df1.merge(df2,on='name').merge(df3,on='name')
Zero avatar May 15 '2014 07:05 Zero