Pandalar veri çerçevesi listesini birlikte birleştirin


129

Tek bir Pandas veri çerçevesinde birleştirmek istediğim Pandas veri çerçevesi listesi var. Python 2.7.10 ve Pandas 0.16.2 kullanıyorum

Veri çerçevesi listesini şuradan oluşturdum:

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

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

Bu, bir veri çerçevesi listesi döndürür

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

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

İşte bazı örnek veriler

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

Ben birleştirmek istiyorum d1, d2ve d3bir pandalar dataframe içine. Alternatif olarak, chunksizeseçeneği kullanırken büyük boyutlu bir tabloyu doğrudan bir veri çerçevesine okumak için bir yöntem çok yararlı olacaktır.

Yanıtlar:


244

Tüm veri çerçevelerinin aynı sütunlara sahip olduğu göz önüne alındığında, concatbunları basitçe yapabilirsiniz :

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

1
aynı sütunlara sahip değillerse, önce bir dikteye çevirebilirsiniz, sonra from_dict - aşağıya bakın
meyerson

1
sütun eklemek isterseniz, axis = 1 argümanını eklemeyi unutmayın
ford prefect

3
Sanırım, bazılarında data.frameaynı sütunlar olmasa bile NaN,pandas
joel.wilson'un

7

Veri çerçevelerinin tümü aynı sütunlara sahip DEĞİLSE, aşağıdakileri deneyin:

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

7
Bu çözüm benim için Python 3.6.5 / Pandas v0.23.0'da çalışmıyor. Hata ile TypeError: data argument can't be an iterator. Birinciye dönüştürmek list(Python 2.7'yi taklit etmek için) beklenmedik sonuçlarla da ortaya çıkıyor.
jpp

ve tüm veri çerçeveleri aynı sütuna sahipse, nasıl yapmalıyız?
Thony Nadhir

6

Bunu işlevsel programlama ile de yapabilirsiniz:

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

2
from functools import reducekullanmakreduce
nishant

Birden çok DataFrame için ikili birleştirme yapılması tavsiye edilmez, hiç de verimli değildir. Bakın pd.concatveya join, her ikisi de çerçeve listesini kabul edin ve varsayılan olarak dizine katılın.
cs95

0

concat mevcut bir veri çerçevesine karşı "loc" komutu kullanılarak alınan bir liste anlayışıyla da iyi çalışır

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])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.