Как заменить выбросы на NaN, сохраняя ряд неповрежденным, используя панд в python? - PullRequest
0 голосов
/ 22 апреля 2019

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

Мне удалось найти выбросы и заменить их на 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, а не всю строку?

Спасибо

Ответы [ 3 ]

1 голос
/ 25 апреля 2019

Чтобы изменить определенную ячейку с помощью 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)

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

http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.where.html?highlight=where#pandas.DataFrame.where

0 голосов
/ 25 апреля 2019

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

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)
0 голосов
/ 25 апреля 2019

Используйте 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])
...