【问题标题】:Pandas: replacing outliers (3 sigma) in all numerical columns of a dataframe with NaNPandas:用 NaN 替换数据框的所有数值列中的异常值(3 sigma)
【发布时间】:2018-03-18 21:09:24
【问题描述】:

我有一个包含数字列和字符串列的数据框。

import numpy as np 
import pandas as pd 
from scipy.stats import zscore

data = {'c1' : [1., 2., 3., 4.], 'c2' : [4., 3., 2., 1.], 'c3' : [5., 6., 7000., 8.], 
        'c4' : [8., 7., 6., 10000.], 'c5' : ['a', 'b', 'c', 'd']}

我想用 NaN 替换数值列中的异常值。

    c1  c2  c3  c4  c5  
0   1.0 4.0 5.0 8.0 a  
1   2.0 3.0 6.0 7.0 b  
2   3.0 2.0 NaN 6.0 c  
3   4.0 1.0 8.0 NaN d 

这段代码做了我想做的事。

df = pd.DataFrame(data) 
allcol = list(df) 
numcol = [x for x in allcol if x not in ('c5')] 
df[numcol] = df[numcol].mask(~df[numcol].apply(lambda x: zscore(x) < 1.5, axis=1)) 

想知道您是否知道任何更好更简单的解决方案...

【问题讨论】:

    标签: python pandas replace nan outliers


    【解决方案1】:

    您可以将'c5'设置为索引,然后使用:

    df1 = df.set_index('c5')
    df1.where(df1.apply(zscore).lt(1.5)).reset_index().reindex_axis(df.columns,1)
    

    输出:

        c1   c2   c3   c4 c5
    0  1.0  4.0  5.0  8.0  a
    1  2.0  3.0  6.0  7.0  b
    2  3.0  2.0  NaN  6.0  c
    3  4.0  1.0  8.0  NaN  d
    

    【讨论】:

    • 或者我们可以使用df.select_dtypes(exclude=['object'])获取数字列:)
    猜你喜欢
    • 2022-10-05
    • 2022-07-06
    • 2018-02-21
    • 2021-03-08
    • 2021-06-29
    • 2018-03-16
    • 2017-11-15
    • 2020-09-05
    • 2021-11-13
    相关资源
    最近更新 更多