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