使用 Pandas 的“where”方法时,“AttributeError:‘float’对象没有属性‘all’”

Posted

技术标签:

【中文标题】使用 Pandas 的“where”方法时,“AttributeError:‘float’对象没有属性‘all’”【英文标题】:"AttributeError: 'float' object has no attribute 'all'" when using "where" method from Pandas 【发布时间】:2015-01-14 10:20:03 【问题描述】:

我正在尝试使用 Pandas 的 where 方法,但我遇到了一个错误。这是一个非常小的例子。

给文件

Chamber,Treatment
1,Sem palha
1,Sem palha
1,Sem palha
2,Sem palha
2,Sem palha

当我跑步时

import pandas
sample = pandas.read_csv('sample.csv')
sample.where(sample['Chamber'] == 1)

我明白了

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-62-96ed02cb41da> in <module>()
----> 1 sample.where(sample['Chamber'] == 1)

/usr/lib/python3.4/site-packages/pandas/core/generic.py in where(self, cond, other, inplace, axis, level, try_cast, raise_on_error)
   3346             new_data = self._data.where(other=other, cond=cond, align=axis is None,
   3347                                         raise_on_error=raise_on_error,
-> 3348                                         try_cast=try_cast)
   3349 
   3350             return self._constructor(new_data).__finalize__(self)

/usr/lib/python3.4/site-packages/pandas/core/internals.py in where(self, **kwargs)
   2434 
   2435     def where(self, **kwargs):
-> 2436         return self.apply('where', **kwargs)
   2437 
   2438     def eval(self, **kwargs):

/usr/lib/python3.4/site-packages/pandas/core/internals.py in apply(self, f, axes, filter, do_integrity_check, **kwargs)
   2416                                                  copy=align_copy)
   2417 
-> 2418             applied = getattr(b, f)(**kwargs)
   2419 
   2420             if isinstance(applied, list):

/usr/lib/python3.4/site-packages/pandas/core/internals.py in where(self, other, cond, align, raise_on_error, try_cast)
   1043         axis = cond.ndim - 1
   1044         cond = cond.swapaxes(axis, 0)
-> 1045         mask = np.array([cond[i].all() for i in range(cond.shape[0])],
   1046                         dtype=bool)
   1047 

/usr/lib/python3.4/site-packages/pandas/core/internals.py in <listcomp>(.0)
   1043         axis = cond.ndim - 1
   1044         cond = cond.swapaxes(axis, 0)
-> 1045         mask = np.array([cond[i].all() for i in range(cond.shape[0])],
   1046                         dtype=bool)
   1047 

AttributeError: 'float' object has no attribute 'all'

【问题讨论】:

sample.where 需要一个与sample 形状相同的布尔数组或 NDFrame。期望的结果是什么?例如,你想要sample['Chamber'].where(sample['Chamber'] == 1) 吗? 【参考方案1】:

您的语法实际上可以在新版本的 pandas 中使用。您可以使用

在 Ubuntu 上升级 pandas
sudo pip install --upgrade pandas

或者如果你使用的是python3,那么

sudo pip3 install --upgrade pandas

【讨论】:

【参考方案2】:

正如 unutbu 在评论中指出的那样,where 似乎是一个“单元格”选择。这些变体按预期工作:

sample[sample["Chamber"] == 1]

sample.query("Chamber == 1")

【讨论】:

以上是关于使用 Pandas 的“where”方法时,“AttributeError:‘float’对象没有属性‘all’”的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 中使用 .loc 和 MultiIndex

使用 np.where 基于多列的 pandas 多个条件

如何在 python/pandas 中使用 where 条件转换 sql 计数?

pandas新字段(数据列)生成使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战

pandas.DataFrame.where和mask 解读

特定列的 Cassandra where 子句 - 最佳方法