FutureWarning:元素比较失败;从熊猫数据框中删除所有行时

Posted

技术标签:

【中文标题】FutureWarning:元素比较失败;从熊猫数据框中删除所有行时【英文标题】:FutureWarning: elementwise comparison failed; when dropping all rows from pandas dataframe 【发布时间】:2020-10-02 02:07:16 【问题描述】:

我想将那些在“候选”列中具有值“0”的行删除。我的一些数据框在此列中只有值“0”。我希望在这种情况下我会得到一个空的数据框,但我会收到以下警告和未更改的数据框。在这种情况下,我怎样才能得到一个空的数据框?或者防止返回未更改的数据框?

警告信息:

C:\Users\User\Anaconda3\lib\site-packages\pandas\core\ops\array_ops.py:253:FutureWarning:元素比较失败;而是返回标量,但将来将执行元素比较 res_values = 方法(右值)

我的代码:

with open(filename, encoding='utf-8') as file:
    df = pd.read_csv(file, sep=',')
    df.drop(df.index[(df['candidate'] == '0')], inplace=True)
    print(df)

     post id  ...  candidate
0          1  ...          0
1          1  ...          0
2          1  ...          0
3          1  ...          0
4          1  ...          0
..       ...  ...        ...
182       10  ...          0
183       10  ...          0
184       10  ...          0
185       10  ...          0
186       10  ...          0

[187 rows x 4 columns]

【问题讨论】:

这不是错误,只是警告。看到这个帖子:***.com/questions/40659212/… 更自然的删除方式是df.loc[df["candidate"]!="0"]。它可能也会避免警告 @AMH 我试过了,但不幸的是这并没有改变任何东西,我仍然收到警告和相同的输出 也许用df.info()检查你的数据类型,读取csv时candidate应该是float或int 【参考方案1】:

您当前的实现尝试从Index 中查找符合条件的行。您应该首先找到与条件匹配的行,然后获取其索引:

df.drop(df[df['candidate'] == 0].index, inplace=True)

替换该行后,您的 sn-p 应该返回:

Empty DataFrame
Columns: [post id, ..., candidate]
Index: []

您还应该检查列的类型是否与您要比较的值的类型相匹配。

【讨论】:

很遗憾,这没有影响。 会不会candidate的类型是int而不是str?我将答案编辑为 compare0 而不是 '0'【参考方案2】:

感谢大家的建议!

确实,值类型是int,但前提是0 是列中的唯一值。如果存在其他值,则类型为 object

所以我通过使用解决了这个问题:

df = df.loc[(df["candidate"] != "0") & (df["candidate"] != 0)]

【讨论】:

以上是关于FutureWarning:元素比较失败;从熊猫数据框中删除所有行时的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到这个错误结果=方法(y)FutureWarning:元素比较失败;而是返回标量

不使用 numpy:FutureWarning:元素比较失败;而是返回标量,但将来将执行元素比较[关闭]

Python loc + isin 返回 FutureWarning(元素比较失败)

熊猫微课堂-冒泡排序预告

如何比较熊猫数据框列中可用的十进制数?

pandas 错误提醒:FutureWarning: elementwise comparison failed;