#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.
Ответ №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])