在 Pandas 数据框布尔索引中使用“相反布尔值”的正确方法

Posted

技术标签:

【中文标题】在 Pandas 数据框布尔索引中使用“相反布尔值”的正确方法【英文标题】:Proper way to use "opposite boolean" in Pandas data frame boolean indexing 【发布时间】:2016-02-04 09:18:25 【问题描述】:

我想使用布尔索引,检查我的数据框中的行,其中特定列具有NaN 值。所以,我做了以下事情:

import pandas as pd
my_df.loc[pd.isnull(my_df['col_of_interest']) == False].head()

查看该数据帧的 sn-p,仅包括不是 NaN 的值(大多数值是 NaN)。

它有效,但似乎不够优雅。我想输入:

my_df.loc[!pd.isnull(my_df['col_of_interest'])].head()

但是,这产生了错误。我也花了很多时间在 R 上,所以也许我把事情搞糊涂了。在 Python 中,我通常会尽可能地使用语法“not”。例如,if x is not none:,但我在这里真的做不到。有没有更优雅的方式?我不喜欢进行毫无意义的比较。

【问题讨论】:

【参考方案1】:

通常对于 pandas(和 numpy),我们使用按位 NOT ~ 代替 !not(其行为不能被类型覆盖)。

虽然在这种情况下我们有notnull,但~ 在没有特殊相反方法的情况下可以派上用场。

>>> df = pd.DataFrame("a": [1, 2, np.nan, 3])
>>> df.a.isnull()
0    False
1    False
2     True
3    False
Name: a, dtype: bool
>>> ~df.a.isnull()
0     True
1     True
2    False
3     True
Name: a, dtype: bool
>>> df.a.notnull()
0     True
1     True
2    False
3     True
Name: a, dtype: bool

(为了完整起见,我会注意到一元负运算符 - 也适用于布尔系列,但 ~ 是规范的选择,而 - 已被 numpy 布尔数组弃用。)

【讨论】:

【参考方案2】:

而不是使用 pandas.isnull() ,您应该使用 pandas.notnull() 来查找列中没有空值的行。示例 -

import pandas as pd
my_df.loc[pd.notnull(my_df['col_of_interest'])].head()

pandas.notnull()pandas.isnull() 的布尔倒数,如文档中所述 -

另请参阅pandas.notnull pandas.isnull 的布尔逆

【讨论】:

以上是关于在 Pandas 数据框布尔索引中使用“相反布尔值”的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:更改通过列中的布尔索引选择的值而不会收到警告

pandas 基础操作 更新

Pandas - 在 DataFrame 中的任何位置查找值索引

Pandas - 查找和索引与行序列模式匹配的行

在 pandas 扩展/滚动功能中,如何使用数据框或系列的索引?

Python如何在pandas数据框中提取[]括号内的指定字符串并创建一个具有布尔值的新列