在 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 - 在 DataFrame 中的任何位置查找值索引