如何选择具有 NaN 特定列的行?

给定这个数据框架,如何只选择那些“ Col2”等于 NaN的行?

df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)], columns=["Col1", "Col2", "Col3"])

看起来像是:

   0   1   2
0  0   1   2
1  0 NaN   0
2  0   0 NaN
3  0   1   2
4  0   1   2

结果应该是这样的:

   0   1   2
1  0 NaN   0
180699 次浏览

试试以下方法:

df[df['Col2'].isnull()]

@ qbzenker

以下是一些备选方案:

In [28]: df.query('Col2 != Col2') # Using the fact that: np.nan != np.nan
Out[28]:
Col1  Col2  Col3
1     0   NaN   0.0


In [29]: df[np.isnan(df.Col2)]
Out[29]:
Col1  Col2  Col3
1     0   NaN   0.0

如果您想选择至少有一个 NaN 值的行,那么您可以在 axis=1上使用 isna + any:

df[df.isna().any(axis=1)]

如果希望选择具有一定数量 NaN 值的行,那么可以在 axis=1 + gt上使用 isna + sum。例如,下面将获取至少具有2个 NaN 值的行:

df[df.isna().sum(axis=1)>1]

如果希望将检查限制在特定列,可以首先选择它们,然后检查:

df[df[['Col1', 'Col2']].isna().any(axis=1)]

如果要选择具有所有 NaN 值的行,可以在 axis=1上使用 isna + all:

df[df.isna().all(axis=1)]

如果希望选择没有 NaN 值的行,可以在 axis=1上选择 notna + all:

df[df.notna().all(axis=1)]

这相当于:

df[df['Col1'].notna() & df['Col2'].notna() & df['Col3'].notna()]

如果有很多列,这可能会变得很乏味。相反,你可以使用 functools.reduce来链接 &操作符:

import functools, operator
df[functools.reduce(operator.and_, (df[i].notna() for i in df.columns))]

numpy.logical_and.reduce:

import numpy as np
df[np.logical_and.reduce([df[i].notna() for i in df.columns])]

如果您想使用 query过滤某些列中没有 NaN 的行,那么可以使用 engine='python'参数:

df.query('Col2.notna()', engine='python')

或者使用 NaN!=NaN喜欢 @ MaxU-停止对 UA 的战争这个事实

df.query('Col2==Col2')