【问题标题】:Pandas: replace outliers in all columns with nan熊猫:用nan替换所有列中的异常值
【发布时间】:2018-03-16 12:19:18
【问题描述】:

我有一个包含 3 列的数据框,例如

c1,c2,c3 
10000,1,2 
1,3,4 
2,5,6 
3,1,122 
4,3,4 
5,5,6 
6,155,6   

我想替换 2 sigma 之外的所有列中的异常值。使用下面的代码,我可以创建一个没有异常值的数据框。

df[df.apply(lambda x: np.abs(x - x.mean()) / x.std() < 2).all(axis=1)]


c1,c2,c3 
1,3,4 
2,5,6 
4,3,4 
5,5,6

我可以分别找到每列的异常值并替换为“nan”,但这不是最好的方法,因为代码中的行数会随着列数的增加而增加。必须有更好的方法来做到这一点。可能是上述行命令的布尔输出,然后将“TRUE”替换为“nan”。

任何建议,非常感谢。

【问题讨论】:

  • 你能准确解释你的问题是什么吗?顺便说一句,您可以摆脱申请 - df[df.sub(df.mean()).abs().div(df.std()).lt(2).all(1)]
  • 我想用“nan”替换数据框中的所有异常值(2 sigma 范围之外)。如果没有应用功能,则必须分别对每一列进行此操作。

标签: pandas replace outliers


【解决方案1】:
lb = df.quantile(0.01)
ub = df.quantile(0.99)
df_new = df[(df < ub) & (df > lb)]
df_new

我正在使用四分位距法来检测异常值。首先,它使用分位数函数计算df的下限和上限。然后基于所有值都应该在下限和上限之间的条件,它返回一个新的 df,其中异常值被 NaN 替换。

【讨论】:

    【解决方案2】:

    pandas
    使用pd.DataFrame.mask

    df.mask(df.sub(df.mean()).div(df.std()).abs().gt(2))
    
        c1   c2  c3 
    0  NaN  1.0  2.0
    1  1.0  3.0  4.0
    2  2.0  5.0  6.0
    3  3.0  1.0  NaN
    4  4.0  3.0  4.0
    5  5.0  5.0  6.0
    6  6.0  NaN  6.0
    

    numpy

    v = df.values
    mask = np.abs((v - v.mean(0)) / v.std(0)) > 2
    pd.DataFrame(np.where(mask, np.nan, v), df.index, df.columns)
    
        c1   c2  c3 
    0  NaN  1.0  2.0
    1  1.0  3.0  4.0
    2  2.0  5.0  6.0
    3  3.0  1.0  NaN
    4  4.0  3.0  4.0
    5  5.0  5.0  6.0
    6  6.0  NaN  6.0
    

    【讨论】:

    • 你能解释一下面具里面发生了什么
    猜你喜欢
    • 2020-03-21
    • 2023-01-23
    • 2020-11-16
    • 2021-06-19
    • 2012-11-06
    • 2019-04-24
    相关资源
    最近更新 更多