Также учтите, что использование apply()
с функцией обычно довольно неэффективно. Старайтесь использовать векторизованные операции всякий раз, когда вы можете ...
Это более эффективное выражение для нормализации каждого столбца в соответствии с минимумом и максимумом для этого столбца:
min = df.min() # per column
max = df.max() # per column
df.join(np.round((df - min) / (max - min), 2).add_prefix('Norm_'))
Это намного быстрее, чем используя apply()
для функции. Для вашего примера DataFrame:
%timeit df.join(np.round((df - df.min()) / (df.max() - df.min()), 2).add_prefix('Norm_'))
9.89 ms ± 102 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
В то время как версия с apply занимает примерно в 4 раза больше:
%timeit df.join(df.apply(func).add_prefix('Norm_'))
45.8 ms ± 1.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Но эта разница быстро растет с размером DataFrame. Например, с DataFrame размером 1000 x 26 я получаю 37,2 мс ± 269 мкс для версии с векторизованными инструкциями, по сравнению с 19,5 с ± 1,82 с для версии, использующей команду apply, примерно в 500 раз быстрее!