Concatene uma lista de quadros de dados de pandas juntos

129

Eu tenho uma lista de quadros de dados do Pandas que gostaria de combinar em um quadro de dados do Pandas. Estou usando o Python 2.7.10 e o Pandas 0.16.2

Criei a lista de quadros de dados de:

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

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

Isso retorna uma lista de quadros de dados

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

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

Aqui estão alguns dados de amostra

# 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]

Eu gostaria de combinar d1, d2e d3em uma trama de dados de pandas. Como alternativa, um método de leitura de uma tabela ish grande diretamente em um dataframe ao usar a chunksizeopção seria muito útil.

Barba branca
fonte

Respostas:

243

Como todos os quadros de dados têm as mesmas colunas, você pode simplesmente concat:

import pandas as pd
df = pd.concat(list_of_dataframes)
Espaço profundo
fonte
1
se eles não têm as mesmas colunas que você pode lançar-los para um dict primeiro e depois usar from_dict - veja abaixo
meyerson
1
se você quiser adicionar colunas, lembre-se de adicionar o argumento eixo = 1
ford prefect
3
Eu acho que, mesmo que alguns data.framenão têm mesmas colunas, em seguida, NaNserão inseridos sem jogar erro na nova versão dopandas
joel.wilson
7

Se os quadros de dados NÃO tiverem as mesmas colunas, tente o seguinte:

df = pd.DataFrame.from_dict(map(dict,df_list))
meyerson
fonte
7
Esta solução não funciona para mim no Python 3.6.5 / Pandas v0.23.0. Ele com erros TypeError: data argument can't be an iterator. A conversão para o listprimeiro (para imitar o Python 2.7) também gera resultados inesperados.
jpp
e se todos os quadros de dados tiverem a mesma coluna, como devemos fazer?
Thony Nadhir 16/03
6

Você também pode fazê-lo com programação funcional:

from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)
Jay Wong
fonte
2
from functools import reduceusarreduce
nishant 24/04
Não seria recomendável fazer uma mesclagem em pares para vários DataFrames, pois não é eficiente. Veja pd.concatou join, ambos aceitam uma lista de quadros e ingressam no índice por padrão.
cs95 29/06
0

concat também funciona bem com uma compreensão de lista obtida usando o comando "loc" em um dataframe 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
fonte