ValueError при попытке удалить выброс в пандах - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть набор данных, в котором мне нужно удалить некоторые огромные выбросы (в 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())]

но они не работают, потому что у меня есть метки времени в моих данных, которые нарушают другие решения.

Есть ли какой-нибудь разумный способ отфильтровать выбросы или заменить их другими значениями?

1 Ответ

0 голосов
/ 05 декабря 2018

TL; DR

Необходимо указать логический вектор для идентификации ячеек фрейма данных, которые вы пытаетесь переназначить.В вашем случае измените выбросы и ошибочные данные на средние (вменяемые).
Я бы сделал это в несколько шагов:

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

Вторая ошибка свойственна вашим данным.Я хотел бы выяснить, почему разные типы данных находятся в одном и том же столбце (числовой и метка времени).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...