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.