Никогда не вызывайте pd.concat
внутри цикла for. Это приводит к квадратичному копированию: concat
возвращает новый DataFrame. Для нового DataFrame должно быть выделено место, а данные из старых DataFrames должны быть скопированы в новый DataFrame.
Таким образом, если ваш фрейм данных имеет N строк, вам потребуется O (N ^ 2) копий. для завершения цикла.
Используйте список словарей или список списков вместо фрейма данных для накопления результатов, а за пределами цикла for создайте свой фрейм данных со списком результатов. Таким образом, вы сэкономите много времени на выполнение, панды для этого не сделано.
Вот как вы можете это сделать:
list_res = []
for index, row in p_data_df.iterrows():
test_df = log_df.loc[row['Mid-C']].to_frame().transpose()
if 'S' not in test_df.columns:
test_df.insert(0, 'S', row.loc['S'])
test_df.insert(1, 'C #', row.loc['C #'])
test_df.insert(2, 'Num', row.loc['Num'])
list_res.append(test_df)
df = pd.concat(list_res, axis=0)
Дополнительные советы по ускорению вашего кода
iterrows - самый медленный из возможных способов итерациифрейм данных, поскольку каждая строка должна быть преобразована в серию. Если вы используете itertuples , этого не произойдет. Вы можете использовать itertuples, не слишком меняя код, но увеличивая производительность.
Существуют другие методы (векторизация, функция применения, Cython ...), которые потребуют немного более широкой модификации вашего кода, но позволят вам иметь более эффективный код. Я оставляю вам эту ссылку для получения дополнительной информации.