Concatenar una lista de marcos de datos de pandas juntos

129

Tengo una lista de marcos de datos de Pandas que me gustaría combinar en un marco de datos de Pandas. Estoy usando Python 2.7.10 y Pandas 0.16.2

Creé la lista de marcos de datos de:

import pandas as pd
dfs = []
sqlall = "select * from mytable"

for chunk in pd.read_sql_query(sqlall , cnxn, chunksize=10000):
    dfs.append(chunk)

Esto devuelve una lista de marcos de datos

type(dfs[0])
Out[6]: pandas.core.frame.DataFrame

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

Aquí hay algunos datos de muestra

# sample dataframes
d1 = pd.DataFrame({'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]})
d2 = pd.DataFrame({'one' : [5., 6., 7., 8.], 'two' : [9., 10., 11., 12.]})
d3 = pd.DataFrame({'one' : [15., 16., 17., 18.], 'two' : [19., 10., 11., 12.]})

# list of dataframes
mydfs = [d1, d2, d3]

Me gustaría combinar d1, d2y d3en una trama de datos pandas. Alternativamente, un método para leer una tabla de gran tamaño directamente en un marco de datos cuando se usa la chunksizeopción sería muy útil.

Barba blanca
fuente

Respuestas:

243

Dado que todos los marcos de datos tienen las mismas columnas, simplemente puede concat:

import pandas as pd
df = pd.concat(list_of_dataframes)
Espacio profundo
fuente
1
si no tienen las mismas columnas, puede lanzarlas primero a un dict y luego usar from_dict - ver abajo
meyerson
1
si desea agregar columnas, recuerde agregar el argumento axis = 1
prefecto ford
3
Supongo que incluso si algunos data.frameno tienen las mismas columnas NaN, se insertarán sin arrojar un error en la nueva versión depandas
joel.wilson
7

Si los marcos de datos NO tienen todas las mismas columnas, intente lo siguiente:

df = pd.DataFrame.from_dict(map(dict,df_list))
meyerson
fuente
77
Esta solución no me funciona en Python 3.6.5 / Pandas v0.23.0. Se equivoca con TypeError: data argument can't be an iterator. La conversión a listprimera (para imitar Python 2.7) también produce resultados inesperados.
jpp
y si todos los marcos de datos tienen la misma columna, ¿cómo deberíamos hacerlo?
Thony Nadhir
6

También puedes hacerlo con programación funcional:

from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)
Jay Wong
fuente
2
from functools import reduceusarreduce
nishant
No recomendaría hacer una combinación por pares para múltiples DataFrames, no es eficiente en absoluto. Ver pd.concato join, ambos aceptan una lista de marcos y se unen en el índice de forma predeterminada.
cs95
0

concat también funciona bien con una comprensión de lista extraída usando el comando "loc" contra un marco de datos existente

df = pd.read_csv('./data.csv') # ie; Dataframe pulled from csv file with a "userID" column

review_ids = ['1','2','3'] # ie; ID values to grab from DataFrame

# Gets rows in df where IDs match in the userID column and combines them 

dfa = pd.concat([df.loc[df['userID'] == x] for x in review_ids])
Lelouch
fuente