Concaténer une liste de dataframes pandas ensemble

129

J'ai une liste de dataframes Pandas que je voudrais combiner en une dataframe Pandas. J'utilise Python 2.7.10 et Pandas 0.16.2

J'ai créé la liste des dataframes à partir de:

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

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

Cela renvoie une liste de dataframes

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

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

Voici quelques exemples de données

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

Je voudrais combiner d1, d2et d3en un seul dataframe pandas géants. Sinon, une méthode de lecture d'une table volumineuse directement dans une trame de données lors de l'utilisation de l' chunksizeoption serait très utile.

Barbe blanche
la source

Réponses:

244

Étant donné que toutes les dataframes ont les mêmes colonnes, vous pouvez simplement concatles:

import pandas as pd
df = pd.concat(list_of_dataframes)
Espace profond
la source
1
s'ils n'ont pas les mêmes colonnes, vous pouvez d'abord les convertir en dict, puis utiliser from_dict - voir ci
meyerson
1
si vous souhaitez ajouter des colonnes, n'oubliez pas d'ajouter l'argument axis = 1
ford prefect
3
Je suppose que même si certains data.framen'ont pas les mêmes colonnes, ils NaNseront insérés sans erreur dans la nouvelle version depandas
joel.wilson
7

Si les dataframes n'ont PAS toutes les mêmes colonnes, essayez ce qui suit:

df = pd.DataFrame.from_dict(map(dict,df_list))
meyerson
la source
7
Cette solution ne fonctionne pas pour moi sur Python 3.6.5 / Pandas v0.23.0. Il se trompe avec TypeError: data argument can't be an iterator. La conversion en listpremier (pour imiter Python 2.7) donne également des résultats inattendus.
jpp
et si toutes les dataframes ont la même colonne, comment faire?
Thony Nadhir
6

Vous pouvez également le faire avec la programmation fonctionnelle:

from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)
Jay Wong
la source
2
from functools import reduceà utiliserreduce
nishant
Je ne recommanderais pas de faire une fusion par paires pour plusieurs DataFrames, ce n'est pas du tout efficace. Voir pd.concatou join, les deux acceptent une liste de cadres et se rejoignent sur l'index par défaut.
cs95 le
0

concat fonctionne également très bien avec une compréhension de liste tirée à l'aide de la commande "loc" sur un dataframe existant

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
la source