Как написать пользовательскую функцию в пандах для выбросов - PullRequest
0 голосов
/ 30 октября 2019

Предположим, у меня есть фрейм данных

import pandas as pd
data = pd.DataFrame()
data["name"] = ["A","B","C","D","E","F","G","H","I","J"]
data["age"] = [22,9,505,39,50,17,26,33,-43,48]
data["marks"] = [422,59,75,3,50,47,2,83,63,48]
data

Теперь я хочу удалить все выбросы из числовых переменных. Я могу сделать это, используя формулу 1,5 + - IQR.

Q1 = data.age.quantile(0.25)
Q3 = data.age.quantile(0.75)
IQR = Q3 - Q1
d=data.loc[~((data.age < (Q1 - 1.5 * IQR)) | (data.age > (Q3 + 1.5 * IQR))),]
d

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

def outlier (data,age):
 Q1 = data.age.quantile(0.25)
 Q3 = data.age.quantile(0.75)
 IQR = Q3 - Q1
 data.loc[~((data.age < (Q1 - 1.5 * IQR)) | (data.age > (Q3 + 1.5 * IQR))),]
 return data



outlier(data,marks)

Однако он говорит, что оценки не определены. Пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Как подсказывает ошибка, marks не определено в вашем коде. Вам нужно передать marks как str

например. outlier(data, "marks")

Вам также необходимо внести изменения в свою функцию, чтобы использовать разные столбцы

def outlier(data, col):
   Q1 = data[col].quantile(0.25)
   Q3 = data[col].quantile(0.75)
   IQR = Q3 - Q1
   data = data.loc[~((data[col] < (Q1 - 1.5 * IQR)) | (data[col] > (Q3 + 1.5 * IQR))),]
   return data
0 голосов
/ 30 октября 2019

Вы можете сделать это путем вычисления z-показателей:

import pandas as pd

def zscore(x):
    """Calculate Z Score."""
    return (x - x.mean()) / x.std()

def remove_outliers(data: pd.DataFrame, column):
    """Remove outliers."""
    # calculate z-score and set nans to 0
    zscores = zscore(data[column])
    zscores[zscores.isnull()] = 0
    return data.iloc[zscores[(-2 < zscores) & (zscores < 2)].index]

data = pd.DataFrame()
data["name"] = ["A","B","C","D","E","F","G","H","I","J"]
data["age"] = [22,9,505,39,50,17,26,33,-43,48]
data["marks"] = [422,59,75,3,50,47,2,83,63,48]

print(remove_outliers(data, "age"))

Вывод:

  name  age  marks
0    A   22    422
1    B    9     59
3    D   39      3
4    E   50     50
5    F   17     47
6    G   26      2
7    H   33     83
8    I  -43     63
9    J   48     48
...