不使用 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

numpy多维索引:使用np数组并列出不同的结果

FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]`

从 Pandas 聚合中重命名结果列(“FutureWarning:不推荐使用带有重命名的字典”)

FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]` 而不是 `arr[seq]`