【问题标题】:TypeError: bad operand type for unary ~: 'float' while groupby and apply a functionTypeError:一元操作数类型错误〜:'float'而groupby并应用函数
【发布时间】:2019-07-11 21:39:52
【问题描述】:

我在使用 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 列中的 NaN 行:df = df[np.isfinite(df['price'])],我应该怎么做才能让它正确返回?感谢您提前提供帮助。

  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'

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    在我看来std 为长度为1 的组返回NaNs,所以使用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)]
    

    【讨论】:

      猜你喜欢
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2013-03-28
      • 2023-03-31
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多