Gabungkan daftar kerangka data panda

129

Saya memiliki daftar kerangka data Pandas yang ingin saya gabungkan menjadi satu kerangka data Pandas. Saya menggunakan Python 2.7.10 dan Pandas 0.16.2

Saya membuat daftar kerangka data dari:

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

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

Ini mengembalikan daftar kerangka data

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

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

Berikut beberapa contoh data

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

Saya ingin menggabungkan d1, d2dan d3menjadi satu panda dataframe. Alternatifnya, metode membaca tabel large-ish secara langsung ke dalam kerangka data saat menggunakan chunksizeopsi akan sangat membantu.

Kumis putih
sumber

Jawaban:

244

Mengingat bahwa semua kerangka data memiliki kolom yang sama, Anda dapat concatmelakukannya:

import pandas as pd
df = pd.concat(list_of_dataframes)
Ruang yang dalam
sumber
1
jika mereka tidak memiliki kolom yang sama Anda dapat mentransmisikannya ke dict terlebih dahulu lalu gunakan from_dict - lihat di bawah
meyerson
1
jika Anda ingin menambahkan kolom, ingatlah untuk menambahkan argumen axis = 1
ford prefek
3
Saya kira, bahkan jika beberapa data.frametidak memiliki kolom yang sama maka NaNakan disisipkan tanpa kesalahan dalam versi barupandas
joel.wilson
7

Jika dataframe TIDAK semuanya memiliki kolom yang sama coba yang berikut ini:

df = pd.DataFrame.from_dict(map(dict,df_list))
meyerson
sumber
7
Solusi ini tidak berfungsi untuk saya di Python 3.6.5 / Pandas v0.23.0. Ini kesalahan dengan TypeError: data argument can't be an iterator. Mengonversi ke yang listpertama (untuk meniru Python 2.7) juga menghasilkan hasil yang tidak terduga.
jpp
dan jika semua dataframe memiliki kolom yang sama, bagaimana yang harus kita lakukan?
Thony Nadhir
6

Anda juga dapat melakukannya dengan pemrograman fungsional:

from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)
Jay Wong
sumber
2
from functools import reduceuntuk digunakanreduce
nishant
Tidak akan merekomendasikan melakukan penggabungan berpasangan untuk beberapa DataFrame, itu tidak efisien sama sekali. Lihat pd.concatatau join, keduanya menerima daftar bingkai dan bergabung dalam indeks secara default.
cs95
0

concat juga bekerja dengan baik dengan pemahaman daftar yang ditarik menggunakan perintah "loc" terhadap kerangka data yang ada

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
sumber