Вот немного более компактный способ сделать это. Вы можете воспользоваться лямбда-функциями и вещанием, чтобы сделать в Pandas гораздо более компактную работу. Во-первых, некоторые фиктивные данные:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1,1,2,5,0], 'B': [10,10,20,50,0], 'C': [20,20,20,50,0]})
Далее, мы можем предварительно вычислить существующие диапазоны, используя apply
метод с фрейма данных и работая вдоль оси 0:
ranges = df.apply(lambda col: col.max() - col.min(), axis=0)
Это дает диапазоны 5, 50 и 50 соответственно. Затем мы можем использовать широковещание , чтобы создать новый кадр данных нормализованных оценок в соответствии с этими диапазонами.
scores = df / ranges * 100
Вы можете объединить последние 2 шага в одну строку, если хотите,но я думаю, что это лучше читать в таком видеОкончательный результат, который вы получите:
A B C
0 20.0 20.0 40.0
1 20.0 20.0 40.0
2 40.0 40.0 40.0
3 100.0 100.0 100.0
4 0.0 0.0 0.0
, который, как я считаю, согласуется с вашим намерением.
Если вам действительно нужно получить только один столбец, вы можете изменить приведенную выше строку нарассчитать только для рассматриваемого столбца.
scores_A = df['A'] / ranges['A'] * 100