选择带有由 isnull() 创建的 2D 布尔掩码的数据框

Posted

技术标签:

【中文标题】选择带有由 isnull() 创建的 2D 布尔掩码的数据框【英文标题】:Selecting dataframe with 2D boolean mask created by isnull() 【发布时间】:2022-01-14 10:43:30 【问题描述】:

这是我的数据框:

area = pd.Series('California': 423967, 'Texas': 695662,'New York': 141297, 'Florida': None, 'Illinois': 149995)
pop = pd.Series('California': 38332521, 'Texas': None,'New York': 19651127, 'Florida': 19552860, 'Illinois': 12882135)
data1 = pd.DataFrame('area':area, 'pop':pop)
data1

area    pop
California  423967.0    38332521.0
Texas   695662.0    NaN
New York    141297.0    19651127.0
Florida NaN 19552860.0
Illinois    149995.0    12882135.0

然后我使用 isnull() 检查 null 并返回一个布尔数组,当它用作掩码时,会给出以下输出:

data1[data1.isnull()]

area    pop
California  NaN NaN
Texas   NaN NaN
New York    NaN NaN
Florida NaN NaN
Illinois    NaN NaN

我不明白在这种情况下它是如何工作的。当我试图扩展它与使用 Series.notnull() 作为掩码的作用相同的想法时,我在课堂上让自己感到尴尬,但它甚至不是可推断的。我希望它能够像 dropna() 一样工作。

编辑:另一个警告是,在 numpy 数组上执行类似的掩码时,我将所有元素都放在一个 1d 数组中,但在 pandas 中不会复制相同的行为。我可以认为其中一个原因是丢失了有关列和索引的信息,但这是它不像 numpy 那样工作的真正原因吗?

【问题讨论】:

【参考方案1】:

要查看包含 NaN 值的行,您可以通过显式应用逻辑将列折叠成线性数组以进行索引:

# the any() operator returns True if the row contains a True somewhere
has_na = [any(row) for row in data1.isna().values]

print(data1[has_na])

打印出来的

             area         pop
Texas    695662.0         NaN
Florida       NaN  19552860.0

【讨论】:

好的,但为什么它给所有的nans?根据this question 输出应该是 nan 仅当掩码为假时,而不是全部。

以上是关于选择带有由 isnull() 创建的 2D 布尔掩码的数据框的主要内容,如果未能解决你的问题,请参考以下文章

带有 Pandas DataFrame 的“df.isnull().any().any()”的更惯用版本? [复制]

如何通过逐行求和(SQL Alchemy)来创建布尔掩码?

选择带有可变布尔运算符的案例

基于布尔掩码将元素移动到 SIMD 寄存器的左侧

Python 2d 数组布尔减少

SQL Server Compact Edition ISNULL(sth, ' ') 返回一个布尔值?