Об'єднайте список фреймів даних панд разом


129

У мене є список фреймів даних Pandas, які я хотів би об'єднати в один фрейм даних Pandas. Я використовую Python 2.7.10 та Pandas 0.16.2

Я створив список фреймів даних із:

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

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

Це повертає список фреймів даних

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

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

Ось деякі зразкові дані

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

Я хотів би об'єднати d1, d2і d3в один панд dataframe. Крім того, метод читання великої таблиці таблиці безпосередньо в кадр даних при використанні chunksizeпараметра буде дуже корисним.

Відповіді:


243

Враховуючи, що всі фрейми даних мають однакові стовпці, ви можете просто concatїх:

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

1
якщо вони не мають однакових стовпців, ви можете спочатку надіслати їх на дік, а потім скористайтеся from_dict - див. нижче
meyerson

1
якщо ви хочете додати стовпці, не забудьте додати аргумент осі = 1
префект ford

3
Я думаю, навіть якщо деякі data.frameне мають однакових стовпців, то NaNвони будуть вставлені без помилки кидання в новій версіїpandas
joel.wilson

7

Якщо фрейми даних НЕ мають усі однакові стовпці, спробуйте виконати наступне:

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

7
Це рішення не працює для мене на Python 3.6.5 / Pandas v0.23.0. Це помилки з TypeError: data argument can't be an iterator. Перетворення на listперше (на імітацію Python 2.7) також має неочікувані результати.
jpp

і якщо всі фрейми даних мають однаковий стовпець, як нам це зробити?
Thony Nadhir

6

Ви також можете це зробити за допомогою функціонального програмування:

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

2
from functools import reduceкористуватисяreduce
nishant

Не рекомендував би робити парне злиття для декількох DataFrames, це зовсім не ефективно. Побачити pd.concatабо joinобидва прийняти список фреймів та приєднатись до індексу за замовчуванням.
cs95

0

concat також чудово працює з розумінням списку, витягнутим за допомогою команди "loc" проти існуючого фрейму даних

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])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.