У меня есть функция, которая обрабатывает DataFrame, в основном для обработки данных в ковши, создает двоичную матрицу признаков в определенном столбце, используя pd.get_dummies(df[col])
.Почему конкатенация DataFrames экспоненциально медленнее?
Чтобы избежать обработки всех моих данных, используя эту функцию сразу (которая выходит из памяти и вызывает IPython врезаться), я сломал большой DataFrame на куски с помощью:
chunks = (len(df)/10000) + 1
df_list = np.array_split(df, chunks)
pd.get_dummies(df)
будет автоматически создавать новые столбцы на основе содержимого df[col]
, и они могут различаться для каждого df
в df_list
.
После обработки, я конкатенация DataFrames обратно вместе с помощью:
for i, df_chunk in enumerate(df_list):
print "chunk", i
[x, y] = preprocess_data(df_chunk)
super_x = pd.concat([super_x, x], axis=0)
super_y = pd.concat([super_y, y], axis=0)
print datetime.datetime.utcnow()
Время обработки первого фрагмента вполне допустимо, однако, он растет на кусок! Это не связано с preprocess_data(df_chunk)
, так как нет никаких причин для его увеличения. Является ли это увеличением времени, возникающего в результате вызова pd.concat()
?
Пожалуйста см войти ниже:
chunks 6
chunk 0
2016-04-08 00:22:17.728849
chunk 1
2016-04-08 00:22:42.387693
chunk 2
2016-04-08 00:23:43.124381
chunk 3
2016-04-08 00:25:30.249369
chunk 4
2016-04-08 00:28:11.922305
chunk 5
2016-04-08 00:32:00.357365
Есть обходной путь, чтобы ускорить этот процесс? У меня 2900 кусков для обработки, поэтому любая помощь приветствуется!
Открыть любые другие предложения на Python!
Привет, @unutbu, спасибо за подробное объяснение, это действительно объясняет теорию в деталях! – jfive
Можно ли объединить 2900 блоков этой формы, таким образом (43717, 3261)? Теперь шаг обработки занимает всего 10 секунд. – jfive