选择带有由 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 布尔掩码的数据框的主要内容,如果未能解决你的问题,请参考以下文章