gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:00:35 31 4
gpt4 key购买 nike

我正在访问此链接以删除异常值,但这里在逻辑上有些错误..

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。我发现这个问题提到使用 float 据帧元素分位数具有不稳定的行为,它返回 NaNs 或 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 并且它默认为“任何”时,所有行都将被删除。您可以通过将“任何”更改为“全部”或其他选项来更改 dropna 的操作方式。可能更好地调整您的上限/下限以更符合您的数据传播。请记住,即使您的边界与每个添加的列都非常排他,但越来越有可能在每一行中至少有一个值落在这些边界之外。

关于python - 使用百分位数从 pandas 数据框中删除异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49514425/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com