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


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.