给出一个带有可能的NaN值的DataFrame,我想确定哪些行具有NaN作为值,但仅适用于某些列。
我相信以下方法应该有效...
my_df.query('colA.isnull() | colZ.isnull() | colN.isnull()')
但是,我遇到以下异常
TypeError: unhashable type: 'numpy.ndarray'
现在,我确定可以传递参数engine='python'
来使查询正常工作。但是,我想使用优化的引擎numexpr
。
这样的查询可能吗?还是我必须一次遍历要过滤的每一列?
谢谢。
答案 0 :(得分:0)
一种方法是构建一个布尔掩码,以选择满足您的任何条件的行。
# 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]
答案 1 :(得分:0)
您可以切片列并使用df.isna()
。
df(使用我今天早些时候从其他地方复制的代码生成,抱歉,我忘记了,但是谢谢!):
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()
的方法。您可以在https://pandas.pydata.org/pandas-docs/stable/indexing.html
.loc
和.iloc
。