gpt4 book ai didi

python - FutureWarning : elementwise comparison failed; returning scalar, 但将来会执行元素比较

转载 作者:IT老高 更新时间:2023-10-28 21:31:35 25 4
gpt4 key购买 nike

我在 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,我应该忽略它,因为它似乎有效。

最佳答案

这个 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 风格的标量还是 bool 的 Numpy 风格的 ndarray? Numpy 说 ndarray of bool,Pythonic 开发人员不同意。经典对峙。

如果元素存在于数组中,应该是元素比较还是标量?

如果您的代码或库使用 in== 运算符将 python 字符串与 numpy ndarrays 进行比较,它们不兼容,所以当你尝试它时,它返回一个标量,但仅限于现在。警告表明,将来这种行为可能会改变,因此如果 python/numpy 决定采用 Numpy 样式,您的代码就会到处乱扔垃圾。

提交的错误报告:

Numpy 和 Python 处于对峙状态,目前该操作返回一个标量,但 future 可能会改变。

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,说这段代码很脆弱,需要这些版本,并在这里放一个链接。把 jar 踢下去。

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

关于python - FutureWarning : elementwise comparison failed; returning scalar, 但将来会执行元素比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40659212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com