Как заменить выбросы на NaN, сохранив строку неповрежденной, используя pandas в python?

#python-3.x #pandas #nan #outliers

#python-3.x #pandas #nan #выбросы

Вопрос:

Я работаю с очень большим файлом, и мне нужно устранить разные выбросы для каждого столбца.

Я смог найти выбросы и заменить их на NaN, однако это превращает всю строку в NaN. Я уверен, что мне не хватает чего-то простого, но, похоже, я не могу его найти.

 import pandas as pd
import numpy as np
pd.set_option('display.max_rows', 100000)   
pd.set_option('display.max_columns', 10)
pd.set_option('display.width', 1000)

df = pd.read_excel('example sheet.xlsx')   

df = df.replace(df.loc[df['column 2']<=0] ,np.nan)
print(df)
  

Как я могу преобразовать только одно значение в NaN, а не всю строку?

Спасибо

Ответ №1:

Чтобы изменить определенную ячейку с помощью NAN, вы должны изменить значение ряда. вместо замены фрейма данных вам следует использовать повторную обработку серии.

Неправильный путь:

 df = df.replace(df.loc[df['column 2']<=0] ,np.nan)
  

Один из правильных способов:

 for col in df.columns:
    s = df[col]
    outlier_s = s<=0
    df[col] = s.where(~outlier_s,np.nan)
  

функция where: Замените значения, где условие равно False.

http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .DataFrame.where.html ?выделите= где #pandas.DataFrame.where

Ответ №2:

Вы можете сделать что-то вроде следующего:

 df.mask(df <= 0, np.nan, axis=1)
  

Нет необходимости перебирать столбцы.

Однако я бы посоветовал вам использовать правильную статистику для определения выбросов вместо <= 0 .

Вы можете использовать quantiles как:

 df.mask(((df < df.quantile(0.05)) or (df > df.quantile(0.95))), np.nan, axis=1)
  

Ответ №3:

Используйте np.where для замены значения на основе условия.

 # if you have to perform only for single column
df['column 2'] = np.where(df['column 2']<=0, np.nan, df['column 2'])


# if you want to apply on all/multiple columns.
for col in df.columns:
    df[col] = np.where(df[col]<=0, np.nan, df[col])