Я новичок в программировании на Python.
Я пытаюсь определить выбросы в моем наборе данных. Я преобразовал набор данных в кадр данных pandas и затем применил принцип IQR
После этого я хочу заменить свои OUTLIERS на ноль, а затем рассчитать среднее значение и стандартное отклонение как выбросы как смещение среднего и SD.
Код для набора данных следующий:
import pandas as pd
data = [[123,100,1200,800,800,1200,900,1400],[246,15,16,45,15,45,11,55],[234,90,105,180,90,180,100,220],[236,100,90,9000,90,9000,70,140]]
df = pd.DataFrame(data,columns=['ID','Store1','Store2','Store3','Min','Max','Lower_Limit','Upper_limit'])
print (df)
Фрагмент набора данных:
ID Store1 Store2 Store3 Min Max Lower_Limit Upper_limit
123 100 1200 800 800 1200 900 1400
246 15 16 45 15 45 11 55
234 90 105 180 90 180 100 220
236 100 90 9000 90 9000 70 140
Я хочу обновить значения Store1, Store2, Store3 до нуля (0), если они меньше, чем Lower_limit (['Store1'] <['Lower_limit']) или больше, чем Upper_limit (['Store1']> [ 'верхняя_граница']).
Ниже моя функция:
def calculate_Outliers(row):
if row['Store1'] < row['Lower_limit'] or row['Store1'] > row['Upper_limit']:
return 0
else:
return row['Store1']
if row['Store2'] < row['Lower_limit'] or row['Store2'] > row['Upper_limit']:
return 0
else:
return row['Store2']
if row['Store3'] < row['Lower_limit'] or row['Store3'] > row['Upper_limit']:
return 0
else:
return row['Store3']
Я применяю это так:
df['Store1','Store3','Store3'] = df.apply(calculate_Outliers, axis=1)
Ниже приведен неверный результат ...
ID Store1 Store2 Store3(Store1 Store2 Store3)
ID
123 NaN NaN NaN NaN 1000
246 NaN NaN NaN NaN 15
234 NaN NaN NaN NaN 0
236 NaN NaN NaN NaN 0
Desired Result:
ID Store1 Store2 Store3 Min Max Lower_Limit Upper_limit
123 100 1200 800 800 1200 900 1400
246 15 16 45 15 45 11 55
234 0 105 180 90 180 100 220
236 100 90 0 90 9000 70 140
Есть ли способ, которым я могу изменить свой исходный код для достижения этой цели?