如果前五列中的 NaN 则删除行

Posted

技术标签:

【中文标题】如果前五列中的 NaN 则删除行【英文标题】:Remove Row if NaN in First Five Columns 【发布时间】:2021-02-08 04:09:41 【问题描述】:

我有一个大小为 89 行 x 13 列的 pandas 数据框。我想删除 整个如果 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 中做到这一点?

【问题讨论】:

【参考方案1】:

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

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

解释:

df.iloc[:, :5]:选择所有行和前 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

【讨论】:

此语句会从原始数据框中删除行吗? @Bill 我已经更新了我的答案以从原始 df 中删除行。请看一看。【参考方案2】:

您可以使用iloc 选择列,notna() 不是NaNany 检查选定列/行中的任何值是否为真

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 ...

【讨论】:

【参考方案3】:

另一种解决方案:在这里您可以指定从C15C19 的列,然后过滤掉所有包含任何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

【讨论】:

以上是关于如果前五列中的 NaN 则删除行的主要内容,如果未能解决你的问题,请参考以下文章

从数据框中删除不包括一组列的列中的nan行。

如果所有列中的值相同,则删除行

如果特定列中的值不是熊猫数据框中的整数,则删除行

r语言怎么用read.table只读文件的前五列

R - 检查 r 数据框行的任何列中是不是存在 NA,如果存在,则删除该行 [重复]

检查 ND-Array 列中的 Nan 值并删除它们