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