给定一个可能有NaN值的DataFrame,我想确定哪些行有NaN作为值,但只针对某些列。
我认为以下内容应该有效。。。
my_df.query('colA.isnull() | colZ.isnull() | colN.isnull()')
然而,我遇到了以下例外
TypeError: unhashable type: 'numpy.ndarray'
现在,我已经确定可以传递参数engine='python'
以使查询工作。但是,我想使用优化的引擎numexpr
。
这样的质疑可能吗?或者,我必须一次一列地迭代要筛选的每一列吗?
谢谢。
一种方法是构建一个布尔掩码,用于挑选满足任何条件的行。
# Method 1: build the boolean mask using bitwise operations
mask = ((df['colA'].isnull()) |
(df['colZ'].isnull()) |
(df['colN'].isnull()))
null_rows = df[mask]
# Method 2: pick desired columns from an element-wise boolean mask of null flags
mask = df.isnull()[['colA', 'colZ', 'colN']].any(axis=1)
null_rows = df[mask]
您可以对列进行切片并使用df.isna()
。
df(使用我今天早些时候在SO上从其他地方复制的代码生成,很抱歉我忘了在哪里,但谢谢!(:
0 1 2 3 4
0 0.763847 1.343149 0.096778 NaN 0.532322
1 -0.364227 -0.560027 NaN NaN NaN
2 -0.556234 0.384970 0.476016 NaN -0.385282
3 0.604560 -0.390024 -1.697762 1.207321 0.829520
4 NaN NaN 0.754011 2.137359 -0.594698
5 0.513925 0.651509 -1.500094 NaN -0.556604
6 NaN NaN -1.388030 NaN NaN
7 NaN -0.634743 0.024213 -0.439684 0.765820
8 0.815948 0.545350 -0.823986 NaN 1.655538
9 0.687386 1.477326 NaN 0.207531 0.571499
df.isna()
:的输出
0 1 2 3 4
0 False False False True False
1 False False True True True
2 False False False True False
3 False False False False False
4 True True False False False
5 False False False True False
6 True True False True True
7 True False False False False
8 False False False True False
9 False False True False False
行操作:
df.isna().sum(axis=1)
0 1
1 3
2 1
3 0
4 2
5 1
6 4
7 1
8 1
9 1
按列:
df.isna().sum()
0 3
1 2
2 2
3 6
4 2
要对df
进行切片,请使用类似df.loc[:, 0:2].isna()
的方法。您可以在此处阅读有关切片、.loc
和.iloc
的信息:https://pandas.pydata.org/pandas-docs/stable/indexing.html