如果前五列为 NaN,则删除行
Remove Row if NaN in First Five Columns
我有一个 pandas 数据框,尺寸为 89 行 x 13 列。我想删除 entire 行 if 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()
用于不 NaN
,any
来检查 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
另一种解决方案:您可以在此处指定列,从 C15
到 C19
然后 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
我有一个 pandas 数据框,尺寸为 89 行 x 13 列。我想删除 entire 行 if 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()
用于不 NaN
,any
来检查 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
另一种解决方案:您可以在此处指定列,从 C15
到 C19
然后 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