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.

Antworten:


241

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

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

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))

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)

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])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.