在使用groupby时,我遇到TypeError异常,并使用函数删除异常值:
def is_outlier(s):
lower_limit = s.median() - (s.std() * 3)
upper_limit = s.median() + (s.std() * 3)
return ~s.between(lower_limit, upper_limit)
df1 = df[~df.groupby('objectName')['price'].apply(is_outlier)]
print(df1)
我用price
过滤了df = df[np.isfinite(df['price'])]
列中的NaN行,我应该怎么做才能使其正确返回?感谢您的帮助。
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\generic.py", line 1143, in __invert__
arr = operator.inv(com._values_from_object(self))
TypeError: bad operand type for unary ~: 'float'
df['price'].describe()
是我得到的,这似乎很正常。
count 10755.000000
mean 7.135314
std 3.844756
min 1.000000
25% 4.700000
50% 6.000000
75% 8.500000
max 49.000000
相关参考文献:
答案 0 :(得分:1)
我认为std
对于长度为NaN
的组返回1
,因此请使用fillna
:
def is_outlier(s):
lower_limit = s.median() - (s.std() * 3)
upper_limit = s.median() + (s.std() * 3)
return s.between(lower_limit, upper_limit)
df1 = df[~df.groupby('objectName')['price'].apply(is_outlier).fillna(True)]