Объедините список фреймов данных pandas вместе

130

У меня есть список фреймов данных 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опции был бы очень полезен.

Белая борода
источник

Ответы:

246

Учитывая, что все фреймы данных имеют одинаковые столбцы, вы можете просто concat:

import pandas as pd
df = pd.concat(list_of_dataframes)
Глубокий космос
источник
1
если у них разные столбцы, вы можете сначала преобразовать их в dict, а затем использовать from_dict - см. ниже
мейерсон
1
если вы хотите добавить столбцы, не забудьте добавить аргумент axis = 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
и если все фреймы данных имеют один и тот же столбец, что нам делать?
Тони Надир,
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])
Лелуш
источник