Функция для удаления выбросов в Python - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь написать функцию для обновления всех выбросов во всех столбцах в dataset с диапазоном interquartile. Он работает, когда я передаю столбец в качестве входных данных, но если я добавляю еще один цикл для итерации по всем столбцам, он не работает.

df2ColumnNames=df2.columns

def fixoutliers(x):

for i in df2ColumnNames:
    print("colnames ",i)
    xy=x[i]    
    print(xy)
    updated=[]
    Q1,Q3=np.percentile(xy,[25,75])
    IQR=Q3-Q1
    #print(IQR)
    minimum=Q1-1.5*IQR
    maximum=Q3+1.5*IQR
    print("maximum",maximum)
    for i in xy:
        if(i>maximum):
            i=maximum
            updated.append(i)
        elif(i<minimum):
            i=minimum
            updated.append(i)
        else:
            print("In else")
            updated.append(i)
    return updated

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Спасибо всем за ваши предложения. После небольшой борьбы мне удалось создать функцию, за которой я следовал. Размещаем решение, если оно кому-то помогает

##### Определить функцию, которая принимает входные данные (x), который может содержать как числовые, так и категориальные столбцы ######

def fixuesliers (x):

##Get all the column name from the input dataframe x
xColumnNames=x.columns
print(xColumnNames)
#for j in df2ColumnNames:

for j in xColumnNames:
    try:
        print("colnames ",j)
        xy=x[j]    
        mydata=pd.DataFrame()
        #print(xy)
        updated=[]
        Q1,Q3=np.percentile(xy,[25,75])
        IQR=Q3-Q1
        minimum=Q1-1.5*IQR
        maximum=Q3+1.5*IQR
        for i in xy:
            if(i>maximum):
                print("Entering maxim")
                i=maximum
                updated.append(i)
            elif(i<minimum):
                print("enterinf minimum")
                i=minimum
                updated.append(i)
            else:
                updated.append(i)
        x[j]=updated
    except:
        continue
return x
0 голосов
/ 05 июля 2018

Поскольку для определения выбросов в боксплоте также используется та же теория «межквартильный диапазон», вы можете использовать ее непосредственно для поиска выбросов в вашем фрейме данных.

import pandas as pd

_, bp = pd.DataFrame.boxplot(df2, return_type='both')
outliers = [flier.get_ydata() for flier in bp["fliers"]]
out_liers = [i.tolist() for i in outliers]
...