python - 尝试删除 Pandas 中的异常值时出现 ValueError

标签 python pandas data-science

我有一个数据集,我需要在其中删除一些巨大的异常值(常规数据的 10 倍),但我想不出一个聪明的方法来做到这一点。我试过了

if df['pickup_latitude'] >= 3*df['pickup_latitude'].mean():
   df['pickup_latitude'] = df['pickup_latitude'].mean()

但这给了我:ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我试过其他方法

df[np.abs(df.Data-df.Data.mean()) <= (3*df.Data.std())]

但它们不起作用,因为我的数据上有时间戳,这会破坏其他解决方案。

有什么聪明的方法可以过滤掉异常值或用其他值替换它们?

最佳答案

长话短说

您需要提供一个 bool 向量来标识您尝试重新分配的数据框单元格。在您的情况下,将异常值和错误数据更改为平均值(估算)。
我会分几个步骤来完成:

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().

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

关于python - 尝试删除 Pandas 中的异常值时出现 ValueError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243492/

相关文章:

python - 如何将 formbuilder 制作的表单添加到 Wagtail 中的每个页面?

python - Python 中 SciPy 树状图的自定义簇颜色(link_color_func?)

Python Groupby 和绘图

python - 在 seaborn.despine() 上动态设置轴偏移

c# - ML.NET 无需拟合即可转换数据

r - 无法让 ggraph 显示树状图的标签

python - 这个 "referenced before assignment"怎么样?

python - Django 的多重继承

python - 在 Python 中使用 pd.read_csv() 仅访问一次带标题的 csv 文件

python - 无法使用 pandas 提取数据框列