Concatena un elenco di frame di dati panda insieme


129

Ho un elenco di dataframe Pandas che vorrei combinare in un dataframe Pandas. Sto usando Python 2.7.10 e Pandas 0.16.2

Ho creato l'elenco dei dataframe da:

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

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

Ciò restituisce un elenco di dataframe

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

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

Ecco alcuni dati di esempio

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

Vorrei unire d1, d2e d3in un unico panda dataframe. In alternativa, un metodo per leggere una tabella di grandi dimensioni direttamente in un dataframe quando si utilizza l' chunksizeopzione sarebbe molto utile.

Risposte:


244

Dato che tutti i dataframe hanno le stesse colonne, puoi semplicemente concat:

import pandas as pd
df = pd.concat(list_of_dataframes)

1
se non hanno le stesse colonne, puoi prima lanciarle su un dict, quindi utilizzare from_dict - vedi sotto
meyerson

1
se desideri aggiungere colonne, ricorda di aggiungere l'argomento axis = 1
ford prefect

3
Immagino che, anche se alcuni data.framenon hanno le stesse colonne, NaNverranno inseriti senza pandas
generare

7

Se i dataframe NON hanno tutti le stesse colonne, prova quanto segue:

df = pd.DataFrame.from_dict(map(dict,df_list))

7
Questa soluzione non funziona per me su Python 3.6.5 / Pandas v0.23.0. Errori con TypeError: data argument can't be an iterator. Anche la conversione al listprimo (per imitare Python 2.7) produce risultati inaspettati.
jpp

e se tutti i dataframe hanno la stessa colonna, come dovremmo fare?
Thony Nadhir il

6

Puoi anche farlo con la programmazione funzionale:

from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)

2
from functools import reduceda usarereduce
nishant

Non consiglierei di fare un'unione a coppie per più DataFrame, non è affatto efficiente. Vedi pd.concato join, entrambi accettano un elenco di frame e si uniscono all'indice per impostazione predefinita.
cs95

0

concat funziona anche bene con una comprensione della lista estratta usando il comando "loc" su un dataframe esistente

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])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.