ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用百分位数从pandas数据框中删除异常值

2019-07-10 16:07:31  阅读:322  来源: 互联网

标签:python python-3-x pandas


我正在关注此链接以删除异常值,但这里的某些内容在逻辑上是错误的..

Remove Outliers in Pandas DataFrame using Percentiles

我有一个数据集,第一列为“id”,最后一列为“label”.

这是我的代码片段,我删除label和id列,然后附加它:

def processing_data(train_data,test_data):
    #computing percentiles.
    low = .05
    high = .95
    filt_df = train_data.loc[:, train_data.columns != 'id']
    filt_df= filt_df.loc[:, filt_df.columns != 'label']
    quant_df = filt_df.quantile([low, high])
    print(quant_df)

    #filtering values based on computed percentiles. To do that use an apply by columns.
    print("Before removing outlier",filt_df,filt_df.shape)
    train_data1 = filt_df.apply(lambda x: x[(x>=quant_df.loc[low,x.name]) & (x <=quant_df.loc[high,x.name])], axis=0)
    print("After removing outlier,",train_data1,train_data1.shape)
    print(train_data1.isnull().sum())
    train_data1= pd.concat([train_data.loc[:,'id'], train_data1], axis=1)
    train_data=pd.concat([train_data.loc[:,'label'], train_data1], axis=1)
    #train_data.dropna(inplace=True)

    #train_data.fillna(0)
    #test_data.fillna(0)
    #print(train_data)
    #print(np.isnan(train_data).any().sum())
    return train_data,test_data

输出:所有行都包含一些NaN值,当我这样做时
            train_data.dropna(inplace = True)删除所有行.
            奇怪!!

我怎样才能解决这个问题?当我在异常处理后连接id和标签栏时,我觉得那里有些腥味?

这是数据集:

id  feature0    feature1    feature2    feature3    feature4    feature249  label
0   25.20824887 -16.7457484 50.86994402 5.593471686 1.188262678   1
1   -86.93144987    0.428227194 2.87483597  -8.064850183    6.056867093     2 
2   42.16093367 7.85701304  151.6127571 9.639675583 5.570138511             0
3   20.66694385 8.680641918 -56.44917913    -9.814779803    -2.382979151    1
4   35.9466789  4.57373573  -28.16021186    -6.91297056 4.879375409         0

解决方法:

当我用你的例子运行你的代码时,我得到了一个ValueError.我发现这个问题提到浮点数据帧元素分位数具有不稳定的行为,它返回NaNs或ValueError https://github.com/pandas-dev/pandas/issues/14564.我认为在这种情况下,它是249列,其中int是浮点数.当我filt_df = pd.DataFrame(filt_df,dtype = float)强制所有列浮动时,它运行正常.

每行中的NaN都是按低和高过滤时放置的.示例中的每一行都至少有一个超出.05 / .95边界的值(您的数据可能比您想象的要扁平得多).这意味着当你使用dropna并且默认为“any”时,所有行都将被删除.您可以通过将“any”更改为“all”或其他选项来更改dropna的运行方式.可能更好地调整您的上限/下限以更符合您的数据传播.请记住,即使您的边界对于每个添加的列都非常独占,但每行中至少有一个值超出这些边界的可能性也越来越大.

标签:python,python-3-x,pandas
来源: https://codeday.me/bug/20190710/1425809.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有