Чтобы прокомментировать комментарии, взгляните на следующее:
df = pd.DataFrame({'a': [1,2,3], 'b': [2,2,2], 'c': [5,6,7], 'd':[8,8,8] })
Обратите внимание, что 'b' и 'd' являются постоянными, что подразумевает стандартное отклонение 0. Применение функции zscore
означает вычитание среднего значения и деление на стандартную ошибку. Если вы разделите число на 0, результат не будет определен, и Pandas покажет NaN.
df.apply(zscore)
Out[8]:
a b c d
0 -1.224745 NaN -1.224745 NaN
1 0.000000 NaN 0.000000 NaN
2 1.224745 NaN 1.224745 NaN
Необходимо либо применить функцию zscore
к выбранным столбцам, либо изменить функцию таким образом, чтобы в ней отсутствовали постоянные столбцы. Чтобы применить функцию только к выбранным столбцам, вы можете сделать следующее:
df[['a','c']] = df[['a','c']].apply(zscore)
df
Out[9]:
a b c d
0 -1.224745 2 -1.224745 8
1 0.000000 2 0.000000 8
2 1.224745 2 1.224745 8
Чтобы позволить функции проверять, является ли столбец постоянным, давайте воспользуемся функцией lambda
, которая возвращает столбец без изменений, если для столбца стандартное отклонение равно 0, или стандартизированный столбец в противном случае.
df.apply(lambda x: x if np.std(x) == 0 else zscore(x))
Out[15]:
a b c d
0 -1.224745 2 -1.224745 8
1 0.000000 2 0.000000 8
2 1.224745 2 1.224745 8