不使用 numpy:FutureWarning:元素比较失败;而是返回标量,但将来将执行元素比较[关闭]
Posted
技术标签:
【中文标题】不使用 numpy:FutureWarning:元素比较失败;而是返回标量,但将来将执行元素比较[关闭]【英文标题】:not using numpy: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison [closed] 【发布时间】:2020-12-14 14:40:43 【问题描述】:这是我的第一篇文章,所以请耐心等待... 假设我有这个 pandas 数据框(这是我在这里找到的示例数据框 How do I use within / in operator in a Pandas DataFrame?) dataframe
好的,现在假设我想更新这个数据框,这样我就没有月份列对应于 9 月的任何行。 这是我一直在使用的代码:
df[df.Month != '0']
它看起来像它的工作原理,但我收到了这个警告:
FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
return op(a, b)
我查看了该网站上发布的其他 FutureWarnings,但大多数都是在人们使用 numpy 时发生的。我已经导入了 numpy,但我没有使用它(或者至少我认为我没有......)。 最重要的是,我不仅收到了这个警告,而且似乎它没有工作,之后我仍然在数据框中保留了 9 月的行。
所以,总而言之,我的问题是如何根据月份值删除这些行?为什么我会收到此警告? 注意,我也试过了
df = df[df.Month != '0']
因为我认为这可能是问题所在,但这也行不通。 有什么想法吗?
注意: 我试着去掉引号,如下所示:
df[df.Month != 0]
这停止了警告,但它仍然无法正常工作并且行没有被删除。
【问题讨论】:
你正在使用 NumPy,因为 Pandas 是建立在它之上的。 为什么要将df.Month
与字符串'0'
进行比较?您的 Month
列实际上是否包含字符串?字符串'0'
真的代表九月吗?
这能回答你的问题吗? FutureWarning: elementwise comparison failed; returning scalar, but in the future will perform elementwise comparison
请提供minimal reproducible example,以及整个错误输出。
@user2357112supportsminoca 很抱歉,你说得对,这是一个错字,我打算写 9。我很抱歉。尽管如此,它仍然无法正常工作,并且行仍然存在。
【参考方案1】:
Pandas 是基于 numpy 构建的。使用 pandas 数据帧的很多操作都非常高效,因为它使用 numpy,它使用 C 代码最有效地使用 CPU。 因此,即使您没有导入 numpy 并明确使用它,pandas 仍在屏幕后面使用它。了解这一点很重要。一旦你了解了 numpy 以及 pandas 是如何使用它的,你就会明白为什么做同样事情的某些方法比其他方法快很多。
要仅选择满足特定条件的行,您可能需要使用.loc[ ]
语法。
对你来说,那就是:df.loc[df.Month != '0']
。
至于目前支持与否:这取决于您使用的 Python、Numpy 和 Pandas 版本。我运行了您的代码,但没有收到任何警告(Python 3.7.6、Numpy 1.18.1、Pandas 1.0.1;和 Python 3.6.9、Numpy 1.13.3、Pandas 1.0.1)。 警告不是错误。您的代码仍会运行,但是当您收到警告时,您应该检查您使用的函数是否确实执行了您希望它执行/期望执行的操作。仔细检查文档。
【讨论】:
我尝试使用 .loc,但它不起作用。我有 python 3.7.9,如果我去掉引号,那么错误就会消失,但我仍然有应该删除的行。我应该补充一点,我之后通过 df.to_csv(data.csv, mode = 'a') 来查看数据框并在 excel 中查看数据框 很奇怪。在 Python3.7.6 中,我创建了一个数据框,该数据框有一列是字符串格式的数字(正如您所见,这就是引号很重要的原因)。df[df.Month != '0']
和 df.loc[df.Month != '0']
都可以正常工作。你有哪个版本的numpy?从文件中读取数据集时,应始终尝试确保每列的数据格式正确。在这里你应该将它设置为整数,使用astype('int')
。
我的 numpy 是 1.19.1,pandas 是 1.1.1。这真的很奇怪!出于某种原因,使用 'dfNEW = df [ df ['Month'] != 0 ].copy() ` 工作并且它不会给出任何错误。诚然,这不是最直接的方法,但由于某种原因,其他解决方案不起作用。感谢您的帮助! :)以上是关于不使用 numpy:FutureWarning:元素比较失败;而是返回标量,但将来将执行元素比较[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
FutureWarning:不推荐将 issubdtype 的第二个参数从“float”转换为“np.floating”
FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]`
从 Pandas 聚合中重命名结果列(“FutureWarning:不推荐使用带有重命名的字典”)
FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]` 而不是 `arr[seq]`