【问题标题】:Error: 'float' object has no attribute 'isna'"错误:‘float’对象没有属性‘isna’”
【发布时间】:2019-11-30 16:23:05
【问题描述】:

我有以下系列:

my_series = pd.Series([np.nan, np.nan, ['A', 'B']])

我必须遍历 my_series 并评估该值是否为 NaN,然后​​执行某些操作(为简单起见,将操作定义为“做 A”和“做 B”)。

第一次尝试:

for element in my_series:
    if element.isna():
        print('do A')
    else:
        print('do B')

运行时出现错误:"'float' object has no attribute 'isna'"

第二次尝试来自问题:Error: float object has no attribute notnull

for element in my_series:
    np.where(element.isnull(), 'do A', 'do B')

运行时出现错误:“AttributeError: 'float' object has no attribute 'isnull'

我在 StackOverflow 上没有找到任何其他类似的问题,我不知道还能尝试什么。

【问题讨论】:

  • 尝试在第二个循环中使用np.isnan()for element in my_series: np.where(np.isnan(element), 'do A', 'do B')
  • 尝试并得到以下错误:“输入类型不支持 ufunc 'isnan',并且根据转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型”
  • 糟糕,然后试试pd.isna()for element in my_series: np.where(pd.isna(element), 'do A', 'do B')

标签: python pandas


【解决方案1】:

将您的代码更改为:

for element in my_series:
    if type(element) == float and pd.isna(element):
        print('do A')
    else:
        print('do B')

根据 Peter 的评论进行编辑

我故意没有改变原来处理源的概念 系列循环。 看起来这两个打印指令都是“占位符”,要 替换为 NaN 值的一段代码和其他值的另一段代码。

【讨论】:

  • pd.isna() 接受任何标量或类似数组的对象,而不仅仅是浮点数。无需检查if type(element) == float。此外,对系列值的显式 for 循环很慢。
  • 最初我按照您的建议进行了尝试。但是如果当前元素是一个 list (就像最后一个元素的情况一样),我得到: ValueError: 具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()。这就是我添加检查 float 类型的原因。
【解决方案2】:

不需要显式的 for 循环。根据您的第二次尝试:

# Setup
my_series = pd.Series([np.nan, np.nan, ['A', 'B']])

# Solution
np.where(my_series.isnull(), 'do A', 'do B')                                              

# Output
array(['do A', 'do A', 'do B'], dtype='<U4')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2016-12-02
    • 2018-06-02
    • 2020-03-25
    • 2019-12-31
    相关资源
    最近更新 更多