Удалить выброс (используя zscore), если вход содержит nan> - PullRequest
0 голосов
/ 03 мая 2020

У меня есть следующее dataframe:

   COL1  COL2  COL3   COL4
0   1.0    10    10  15000
1   2.0  1150    20  10020
2   3.0  1160  3035  10035
3   4.0  1117     2  10055
4   NaN  1131    50  10067

Я хочу удалить выброс, используя zscore.

Я попытался сделать это с помощью следующего кода строки:

df = df[(np.abs(stats.zscore(df, nan_policy='omit'))<1.8).all(axis=1)]

но я получаю предупреждение:

RuntimeWarning: invalid value encountered in less
  df = df[(np.abs(stats.zscore(df, nan_policy='omit'))<1.8).all(axis=1)]

И результат:

   COL1  COL2  COL3   COL4
1   2.0  1150    20  10020
3   4.0  1117     2  10055

Я запутался:

  1. Почему я получая предупреждение, если я установил nan_policy='omit'?
  2. Я думал, что мой код сохранит строки: 1, 3, 4 Почему я не получил этот вывод? (Если мы игнорируем Nan?)

Полный код:

dict = {'COL1': [1, 2, 3, 4, np.nan],
        'COL2': [10, 1150, 1160, 1117, 1131],
        'COL3': [10, 20, 3035, 2, 50],
        'COL4': [15000, 10020, 10035, 10055, 10067]}

df = pd.DataFrame(dict)
print(df.head())
zscore = np.abs(stats.zscore(df))
print(zscore)
df = df[(np.abs(stats.zscore(df, nan_policy='omit'))<1.8).all(axis=1)]
print(df)

1 Ответ

1 голос
/ 04 мая 2020

nan_policy='omit' игнорирует значение NaN для расчета среднего и стандартного отклонения, однако при расчете zscore значения NaN будут сопоставлены с NaN

np.abs(stats.zscore(df, nan_policy='omit')).round(2)
# array([[1.34, 2.  , 0.51, 2.  ],
#    [0.45, 0.52, 0.5 , 0.51],
#    [0.45, 0.55, 2.  , 0.5 ],
#    [1.34, 0.45, 0.52, 0.49],
#    [ nan, 0.48, 0.48, 0.49]]) #There is NaN value here

Тогда np.abs(stats.zscore(df, nan_policy='omit')) < 1.8 будет Как предупреждение, и имейте в виду, что:

np.nan < 1.8  # False

Вы можете использовать numpys nan_to_num для замены на 0:

df = df[(np.nan_to_num(np.abs(stats.zscore(df, nan_policy='omit')),0) < 1.8).all(axis=1)]
df

#   COL1    COL2    COL3    COL4
# 1 2.0     1150    20      10020
# 3 4.0     1117    2       10055
# 4 NaN     1131    50      10067
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...