TypeError:错误的操作数类型为一元〜:在groupby时使用'float'并应用函数

时间:2019-02-18 13:27:09

标签: python pandas numpy

在使用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

相关参考文献:

TypeError: bad operand type for unary ~: float

TypeError: bad operand type for unary ~: 'float'

1 个答案:

答案 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)]