如果前五列为 NaN,则删除行

Remove Row if NaN in First Five Columns

我有一个 pandas 数据框,尺寸为 89 行 x 13 列。我想删除 entireif NaN 出现在前五列中。这是一个例子。

LotName     C15   C16  C17  C18  C19 Spots15 Spots16 ...
Cherry St   439   464  555  239  420     101     101 ...
Springhurst NaN   NaN  NaN  NaN  NaN      12      12
Barton Lot   34    24   43   45   39      10       9 ...

在上面的示例中,我想删除 Springhurst 观察,因为它在前五列中包含 NaN。我如何才能在 Python 中做到这一点?

您可以使用 iloc 来 select 您的列,notna() 用于不 NaNany 来检查 selected columns/rows 是正确的

mask = df.iloc[:,:5].notna().any(axis=1)
df[mask]

输出:

              C15    C16    C17    C18    C19  Spots15 Spots16 ...
LotName                                                           
Cherry St   439.0  464.0  555.0  239.0  420.0      101     101 ...
Barton Lot   34.0   24.0   43.0   45.0   39.0       10       9 ...

如果要对前 5 列的所有行中的 Nan 进行严格检查:

df.iloc[:, :5].dropna(how='all')

解释:

df.iloc[:, :5] : select 所有行和前 5 列

.dropna(how='all') :检查一行中的所有值是否都是 NaN

如果您想在 5 列中的任何一列中检查 Nan

df.iloc[:, :5].dropna(how='any')

要将其分配回原始 df,您可以这样做:

In [2107]: ix = df.iloc[:, :5].dropna(how='all').index.tolist()

In [2110]: df = df.loc[ix]

In [2111]: df
Out[2111]: 
       LotName    C15    C16    C17    C18  C19  Spots15  Spots16
Cherry      St  439.0  464.0  555.0  239.0  420      101    101.0
Barton     Lot   34.0   24.0   43.0   45.0   39       10      9.0

另一种解决方案:您可以在此处指定列,从 C15C19 然后 filter-out 所有包含 NaN 的行:

print( df[~df.loc[:, 'C15':'C19'].isna().any(axis=1)] )

打印:

      LotName    C15    C16    C17    C18    C19  Spots15  Spots16
0   Cherry St  439.0  464.0  555.0  239.0  420.0      101      101
2  Barton Lot   34.0   24.0   43.0   45.0   39.0       10        9