Hong Jinwoo
Hong Jinwoo

Reputation: 23

Replacing Outliers with median in pandas

I trying to do something with pandas.....

I finished separating outlier from my dataframe, but I don't know how to set my outliers age to median... Can I get some help?

Here's my code

users = pd.read_table('user.txt', sep='|', index_col='user_id')
print(users)
         age gender occupation zip_code
user_id                                
1         24      M     artist    85711
2         53      F     artist    94043
3         23      M   educator    32067
4         24      M     artist    43537
5         33      F     artist    15213
...      ...    ...        ...      ...
939       26      F    student    33319
940       32      M   engineer    02215
941       20      M    student    97229
942       48      F   educator    78209
943       22      M    student    77841

[943 rows x 4 columns]
users_age = users.reset_index()[['occupation','age']]
users_age_grouped = users_age.groupby('occupation')
users_age['Lower'] = users_age_grouped['age'].transform(
    lambda x: x.quantile(q=.25) - 1.5 * (x.quantile(q=.75) - x.quantile(q=.25)))
users_age['Median'] = users_age_grouped['age'].transform(lambda x: x.quantile(q=.5))
users_age['Upper'] = users_age_grouped['age'].transform(
    lambda x: x.quantile(q=.75) + 1.5 * (x.quantile(q=.75) - x.quantile(q=.25)))

users_age['Outlier'] = (users_age['Lower'] > users_age['age']) |\
    (users_age['Upper'] < users_age['age'])

users_age_outlier = users_age[users_age['Outlier']]
users_age_wo_outlier = users_age[users_age['Outlier'] == False]

print(users_age_outlier)
    occupation  age  Lower  Median  Upper  Outlier
29     student    7    8.5      22   36.5     True
38     student   41    8.5      22   36.5     True
187    student   42    8.5      22   36.5     True
210     artist   66    3.5      31   63.5     True
417    student   55    8.5      22   36.5     True
422     artist   64    3.5      31   63.5     True
558   engineer   69    6.5      36   66.5     True
564    student   40    8.5      22   36.5     True
766   engineer   70    6.5      36   66.5     True
802   engineer   70    6.5      36   66.5     True
838    student   38    8.5      22   36.5     True
860    student   38    8.5      22   36.5     True
914    student   50    8.5      22   36.5     True
925    student   49    8.5      22   36.5     True

What method I can use?

Upvotes: 2

Views: 1075

Answers (1)

jezrael
jezrael

Reputation: 862691

I think you need Series.between with numpy.where:

mask = users_age['age'].between(users_age['Lower'], users_age['Upper'], inclusive=False)

users_age['age'] = np.where(mask, users_age['Median'], users_age['age'])

Upvotes: 1

Related Questions