Verketten Sie eine Liste von Pandas-Datenrahmen

129

Ich habe eine Liste von Pandas-Datenrahmen, die ich zu einem Pandas-Datenrahmen kombinieren möchte. Ich benutze Python 2.7.10 und Pandas 0.16.2

Ich habe die Liste der Datenrahmen erstellt aus:

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

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

Dies gibt eine Liste von Datenrahmen zurück

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

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

Hier sind einige Beispieldaten

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

Ich möchte kombinieren d1, d2und d3in einen Pandas Datenrahmen. Alternativ wäre eine Methode zum Einlesen einer großen Tabelle direkt in einen Datenrahmen bei Verwendung der chunksizeOption sehr hilfreich.

Weißer Bart
quelle

Antworten:

241

Da alle Datenrahmen dieselben Spalten haben, können Sie sie einfach concat:

import pandas as pd
df = pd.concat(list_of_dataframes)
Weltraum
quelle
1
Wenn sie nicht die gleichen Spalten haben, können Sie sie zuerst in ein Diktat umwandeln und dann from_dict - siehe unten
meyerson
1
Wenn Sie Spalten hinzufügen möchten, denken Sie daran, das Argument axis = 1 hinzuzufügen
ford
3
Ich denke, auch wenn einige data.framenicht die gleichen Spalten haben, NaNwerden sie ohne Fehler in die neue Version vonpandas
joel.wilson
7

Wenn die Datenrahmen NICHT alle dieselben Spalten haben, versuchen Sie Folgendes:

df = pd.DataFrame.from_dict(map(dict,df_list))
Meyerson
quelle
7
Diese Lösung funktioniert bei Python 3.6.5 / Pandas v0.23.0 nicht. Es fehlerhaft mit TypeError: data argument can't be an iterator. Die Konvertierung in listfirst (um Python 2.7 nachzuahmen) führt ebenfalls zu unerwarteten Ergebnissen.
Jpp
und wenn alle Datenrahmen dieselbe Spalte haben, wie sollen wir vorgehen?
Thony Nadhir
6

Sie können dies auch mit funktionaler Programmierung tun:

from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)
Jay Wong
quelle
2
from functools import reducezu verwendenreduce
nishant
Ich würde nicht empfehlen, eine paarweise Zusammenführung für mehrere DataFrames durchzuführen, da dies überhaupt nicht effizient ist. Siehe pd.concatoder join, beide akzeptieren eine Liste von Frames und verbinden sich standardmäßig mit dem Index.
cs95
0

concat funktioniert auch gut mit einem Listenverständnis, das mit dem Befehl "loc" für einen vorhandenen Datenrahmen abgerufen wird

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
quelle