我有一个数据集,需要删除一些巨大的离群值(是常规数据的10倍),但是我不知道这样做的聪明方法。我尝试过
if df['pickup_latitude'] >= 3*df['pickup_latitude'].mean():
df['pickup_latitude'] = df['pickup_latitude'].mean()
但这给了我:ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
我尝试了其他方法
df[np.abs(df.Data-df.Data.mean()) <= (3*df.Data.std())]
但是它们不起作用,因为我的数据带有时间戳,这会破坏其他解决方案。
有什么聪明的方法可以滤除异常值或将其替换为其他值?
答案 0 :(得分:1)
您需要提供布尔向量来标识您要重新分配的数据帧单元。您需要将异常值和错误数据更改为平均值(估算值)。
我将分几个步骤进行操作:
df = pd.DataFrame([0,1,3,'blah',4,5,'blah'], columns = ['pickup_latitude'])
# Identify the numeric observations
numeric = df['pickup_latitude'].astype(str).str.isdigit()
# Calculate mean
mean = df.loc[numeric,'pickup_latitude'].mean()
# Impute non numeric values
df.loc[~numeric,'pickup_latitude'] = mean
# Impute outliers
df.loc[df['pickup_latitude'] >= mean, 'pickup_latitude'] = mean
df['pickup_latitude']
Out[81]:
0 0
1 1
2 2.6
3 2.6
4 2.6
5 2.6
6 2.6
Name: pickup_latitude, dtype: object
我还将深入研究清理数据。
直观的解释:
我不认为它不会归因于数字数据时间戳等数据完整性问题。我能够复制您描述的第一个错误。
您不能这样做:
import pandas as pd
df = pd.DataFrame([0,1,3,4,5], columns = ['pickup_latitude'])
if df['pickup_latitude'] >= df['pickup_latitude'].mean():
df['pickup_latitude'] = df['pickup_latitude'].mean()
代码尝试将一个系列与一个常数进行比较:
df['pickup_latitude']
Out[12]:
0 0
1 1
2 3
3 4
4 5
Name: pickup_latitude, dtype: int64
df['pickup_latitude'].mean()
Out[13]: 2.6
if df['pickup_latitude'] >= df['pickup_latitude'].mean():
df['pickup_latitude'] = df['pickup_latitude'].mean()
Traceback (most recent call last):
File "<ipython-input-15-1135c8386dd6>", line 1, in <module>
if df['pickup_latitude'] >= df['pickup_latitude'].mean():
File "C:\Users\____\AppData\Local\Continuum\anaconda3\envs\DS\lib\site-packages\pandas\core\generic.py", line 1121, in __nonzero__
.format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
第二个错误是您的数据所特有的。我将调查为什么不同的数据类型驻留在同一列(数字和时间戳)中。