【问题标题】:Python: replacing outliers values with median valuesPython:用中值替换异常值
【发布时间】:2018-01-05 07:37:58
【问题描述】:

我有一个 python 数据框,其中有一些异常值。如果这些值不存在,我想用数据的中值替换它们。

id         Age
10236    766105
11993       288
9337        205
38189        88
35555        82
39443        75
10762        74
33847        72
21194        70
39450        70

所以,我想将所有> 75的值替换为剩余数据集的数据集的中值,即70,70,72,74,75的中值。

我正在尝试执行以下操作:

  1. 替换为0,所有大于75的值
  2. 将 0 替换为中值。

但不知何故,下面的代码不起作用

df['age'].replace(df.age>75,0,inplace=True)

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    我认为这就是您要寻找的,您可以使用 loc 来分配 value 。然后你可以填写nan

    median = df.loc[df['Age']<75, 'Age'].median()
    df.loc[df.Age > 75, 'Age'] = np.nan
    df.fillna(median,inplace=True)
    

    你也可以在一行中使用 np.where

    df["Age"] = np.where(df["Age"] >75, median,df['Age'])
    

    您也可以使用 .mask 即

    df["Age"] = df["Age"].mask(df["Age"] >75, median)
    

    【讨论】:

    • 更改为Age &gt; 75。 +1
    • 很高兴帮助@user4943236
    【解决方案2】:

    我最近尝试过的更通用的解决方案:将 75 替换为整列的中位数,然后遵循类似于 Bharath 建议的解决方案:

    median = float(df['Age'].median())
    df["Age"] = np.where(df["Age"] > median, median, df['Age'])
    

    【讨论】:

    • 但是在这种情况下,作为阈值的中值会受到所有值(包括异常值)的影响。
    【解决方案3】:

    您的代码几乎是正确的,但它们之间存在差距。
    使用:

    df['age']=df['age'].replace(df.age>75,0,inplace=True)
    

    【讨论】:

      【解决方案4】:

      实际上,这并不是处理数据中异常值的有效方法。

      你可以参考这篇文章 https://www.kite.com/python/answers/how-to-remove-outliers-from-a-pandas-dataframe-in-python

      通过计算一列或整个数据集的 z 分数,您可以用动态和数学计算替换异常值。

      【讨论】:

        猜你喜欢
        • 2020-08-10
        • 2019-03-14
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        • 2021-04-11
        • 2016-06-25
        相关资源
        最近更新 更多