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

4

我正在关注这个链接以去除异常值,但这里似乎有逻辑上的问题。

使用百分位数在Pandas DataFrame中删除异常值

我的数据集第一列是“id”,最后一列是“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和label列时,感觉有些不对劲?

这是数据集:

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

那只是为了探索输出。我只想从数据集中删除异常值。 - DreamerP
2
你能发布一些起始数据样本以及你想要它看起来像什么吗? - Ian Thompson
1
一个包含一些数据并能运行您的函数的 [mcve] 在这里会很有帮助。 - jpp
有没有任何链接可以上传完整的数据集?这将非常有帮助。 - DreamerP
1
@DreamerP 你不需要上传完整的数据集。如果你有Excel,只需复制前15-20行数据并将其粘贴到这里,并将其格式化为代码即可。那应该就足够了。 - Floydian
显示剩余4条评论
1个回答

0

当我使用你的例子运行你的代码时,我得到了一个ValueError。我发现这个问题提到了在浮点数据帧元素中,quantile具有不稳定的行为,它会返回NaN或ValueError https://github.com/pandas-dev/pandas/issues/14564。我认为在这种情况下,是第249列是int类型,而其他列都是float类型。当我使用filt_df = pd.DataFrame(filt_df, dtype=float)将所有列强制转换为float类型时,它就可以正常运行了。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接