我经常使用以下命令删除具有一个具有NAN值的单元格的行:
pos_data = df.iloc[:,[5,6,2]].dropna()
否,我想知道如何保留带有NAN的行,并删除其中一列中没有NAN的所有其他行。 我的数据是熊猫数据框。
谢谢。
答案 0 :(得分:1)
使用布尔索引,找到行中至少具有一个 NaN的所有列,然后使用掩码进行过滤。
df[df.iloc[:, [5, 6, 2]].isna().any(1)]
DeMorgan的等效项是:
df[~df.iloc[:, [5, 6, 2]].notna().all(1)]
df = pd.DataFrame({'A': ['x', 'x', np.nan, np.nan], 'B': ['y', np.nan, 'y', 'y'], 'C': list('zzz') + [np.nan]})
df
A B C
0 x y z
1 x NaN z
2 NaN y z
3 NaN y NaN
如果我们仅考虑列“ A”和“ C”,那么我们的解决方案将类似于
df[['A', 'C']]
A C
0 x z
1 x z
2 NaN z
3 NaN NaN
# Check which cells are NaN
df[['A', 'C']].isna()
A C
0 False False
1 False False
2 True False
3 True True
# Use `any` along the first axis to perform a logical OR across columns
df[['A', 'C']].isna().any(axis=1)
0 False
1 False
2 True
3 True
dtype: bool
# Now, we filter
df[df[['A', 'C']].isna().any(axis=1)]
A B C
2 NaN y z
3 NaN y NaN
如前所述,与此相反的是使用notna
+ all(axis=1)
:
df[['A', 'C']].notna().all(1)
0 True
1 True
2 False
3 False
dtype: bool
# You'll notice this is the logical inverse of what we need,
# so we invert using bitwise NOT `~` operator
~df[['A', 'C']].notna().all(1)
0 False
1 False
2 True
3 True
dtype: bool
答案 1 :(得分:0)
这应删除所有不具有至少1个na值的行:
df[df.isna().any(axis=1)]