我有一个熊猫数据框,尺寸为89行x 13列。我想删除整个行,如果 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中做到这一点?
答案 0 :(得分:5)
如果要对前5列的所有行进行严格检查Nan
:
df.iloc[:, :5].dropna(how='all')
说明:
df.iloc[:, :5]
:选择所有行和前5列
.dropna(how='all')
:检查一行中的所有值是否均为NaN
如果要在5列中的任何一列中检查Nan
:
df.iloc[:, :5].dropna(how='any')
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
答案 1 :(得分:3)
您可以使用iloc
选择列,notna()
代替NaN
,any
检查选中的列/行中的任何值是否为True < / p>
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 ...
答案 2 :(得分:2)
另一种解决方案:您可以在此处指定从C15
到C19
的列,然后过滤掉其中包含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