Проблемы с памятью при объединении фреймов данных в pandas (с индексацией по времени)

#pandas #join #time #merge #series

#pandas #Присоединиться #время #слияние #Серии

Вопрос:

Я пытаюсь объединить (или объединить) два фрейма данных в pandas, которые индексированы по времени, но мой код накапливает таблицы в памяти.

Размер каждого файла составляет всего 1 МБ, и после нескольких файлов на компьютере заканчивается память.

Как можно выполнить эту операцию на месте?

Метод, используемый для объединения таблиц (левая, правая, внутренняя, внешняя …), не меняет проблему с производительностью.

 import pandas as pd
from glob import glob  

filenames = glob('*.txt')

filename = filenames[0]
varname =  filename[:-11] # removes three last char extension from string

print('Sampling', filename)
data = pd.read_csv(filename, sep=';', skiprows=3, names=['time', varname ],
               index_col=0)


for filename in filenames[1:]:

    print('Sampling', filename)

    varname =  filename[:-11] # removes three last char extension from string

    data_new = pd.read_csv(filename, sep=';', skiprows=3, names=['time', varname ],
               index_col=0)


    #data = pd.DataFrame.join(data, data_new, how='outer', on='time')
    data = pd.DataFrame.merge(data_new, data, how='outer', on='time', copy=False)
  

Это data.head() и data.tail() после запуска кода для трех файлов.

                     var1    var2    var3    var4    var5
time                    
01/01/2016 07:00:00 13.3781 6.95406 NaN 87.6588 71.5696
01/01/2016 08:00:00 13.2312 6.89561 NaN 87.6221 71.6038
01/01/2016 09:00:00 13.2774 6.90632 NaN 87.2595 71.4383
01/01/2016 10:00:00 13.6152 7.02360 NaN 87.2028 71.4482
01/01/2016 11:00:00 13.5584 7.00147 NaN 87.3733 71.3335
  

                     var1    var2    var3    var4    var5
time                    
01/01/2019 02:00:00 15.8096 28.2316 NaN 87.5106 68.6665
01/01/2019 03:00:00 15.8352 28.1616 NaN 87.7226 69.0639
01/01/2019 04:00:00 15.6879 27.6819 NaN 87.1135 68.6873
01/01/2019 05:00:00 15.6558 27.7961 NaN 87.4658 69.1395
01/01/2019 06:00:00 15.7383 28.1330 NaN 87.5775 68.8240
  

Комментарии:

1. Было бы полезно разобраться во входных данных. В вашем MCVE вы могли бы сгенерировать файлы примеров. Попробуйте вытащить загрузку CSV из цикла, который выполняет слияние. Это поможет вам понять, какая часть вызывает проблему. По сути, нет ничего плохого в загрузке десятков фреймов данных и хранении их в памяти перед операцией с ними.

Ответ №1:

Если фреймы данных имеют один и тот же индекс, pd.concat выполняет операцию без проблем.

 data = pd.concat([data, data_new], axis=1)