Python 尝试删除数据中的异常值时发生ValueError

Python 尝试删除数据中的异常值时发生ValueError,python,pandas,data-science,Python,Pandas,Data Science,我有一个数据集,我需要删除一些巨大的异常值(是常规数据的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() 我尝试过其他方法

我有一个数据集,我需要删除一些巨大的异常值(是常规数据的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())]
太长了,读不下去了。 您需要提供一个布尔向量来标识您试图重新分配的数据帧单元格。在您的情况下,将异常值和错误数据更改为平均值(插补)。
我会分几个步骤来做:

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().
df['拾取纬度']
出[12]:
0    0
1    1
2    3
3    4
4    5
名称:皮卡车纬度,数据类型:int64
df['拾取纬度].平均值()
Out[13]:2.6
如果df['Picking_latitude']>=df['Picking_latitude'].mean():
df['Picking_latitude']=df['Picking_latitude']。平均值()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
如果df['Picking_latitude']>=df['Picking_latitude'].mean():
文件“C:\Users\\ uuuuuuuuu\AppData\Local\Continuum\anaconda3\envs\DS\lib\site packages\pandas\core\generic.py”,第1121行,非零__
.format(self.\uuuuuu class.\uuuuuuu.\uuuuuu name.\uuuuuuuuu))
ValueError:序列的真值不明确。请使用a.empty、a.bool()、a.item()、a.any()或a.all()。

第二个错误是您的数据特有的。我会调查为什么不同的数据类型驻留在同一列中(数字和时间戳)。

但它们不起作用,因为我的数据上有时间戳。
。为什么其他系列(或索引)中的时间戳会影响您的逻辑?如果您发布一个可复制的示例,我们可能会有所帮助。