FutureWarning:元素比较失败;返回标量,但将来会执行元素比较

新手上路,请多包涵

我在 Python 3 上使用 Pandas 0.19.1 。我在这些代码行上收到警告。我正在尝试获取一个列表,其中包含所有行号,其中字符串 Peter 出现在列 Unnamed: 5

 df = pd.read_excel(xls_path)
myRows = df[df['Unnamed: 5'] == 'Peter'].index.tolist()

它产生一个警告:

 "\Python36\lib\site-packages\pandas\core\ops.py:792: FutureWarning: elementwise
comparison failed; returning scalar, but in the future will perform
elementwise comparison
result = getattr(x, name)(y)"

这个 FutureWarning 是什么,我应该忽略它,因为它似乎有效。

原文由 user411103 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
1 个回答

这个 FutureWarning 不是来自 Pandas,而是来自 numpy,下面是如何在更接近问题根源的地方重现警告:

 import numpy as np
print(np.__version__)   # Numpy version '1.12.0'
'x' in np.arange(5)       #Future warning thrown here

FutureWarning: elementwise comparison failed; returning scalar instead, but in the
future will perform elementwise comparison
False

使用双等号运算符重现此错误的另一种方法:

 import numpy as np
np.arange(5) == np.arange(5).astype(str)    #FutureWarning thrown here

这里发生了什么?

在将字符串与 numpy 的数字类型进行比较时,Numpy 和本机 python 之间存在分歧。注意右操作数是 python 的地盘,原始字符串,中间操作是 python 的地盘,但左操作数是 numpy 的地盘。您应该返回 Python 风格的标量还是 Numpy 风格的布尔型 ndarray? Numpy 说 ndarray of bool,Pythonic 开发者不同意。经典对峙。

如果数组中存在项目,它应该是逐元素比较还是标量?

如果您的代码或库使用 in== 运算符将 python 字符串与 numpy ndarrays 进行比较,它们不兼容,因此当您尝试它时,它会返回一个标量,但只是现在。警告表明将来这种行为可能会改变,所以如果 python/numpy 决定采用 Numpy 风格,你的代码就会吐得满地都是。

提交的错误报告:

Numpy 和 Python 处于僵持状态,目前操作返回标量,但将来可能会改变。

https://github.com/numpy/numpy/issues/6784

https://github.com/pandas-dev/pandas/issues/7830

两种解决方法:

要么锁定你的 python 和 numpy 版本,忽略警告并期望行为不会改变,要么将 ==in 的左右操作数转换为 numpy 类型或原始 python 数字类型。

全局抑制警告:

 import warnings
import numpy as np
warnings.simplefilter(action='ignore', category=FutureWarning)
print('x' in np.arange(5))   #returns False, without Warning

逐行抑制警告。

 import warnings
import numpy as np

with warnings.catch_warnings():
    warnings.simplefilter(action='ignore', category=FutureWarning)
    print('x' in np.arange(2))   #returns False, warning is suppressed

print('x' in np.arange(10))   #returns False, Throws FutureWarning

只需按名称抑制警告,然后在它旁边大声评论提及 python 和 numpy 的当前版本,说这段代码很脆弱,需要这些版本,并在此处放置一个链接。把罐子踢到路上。

TLDR: pandas 是绝地; numpy 是小屋;而 python 是银河帝国。

原文由 Eric Leschinski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题