删除所有*不*在其列中包含任何NaN的行

时间:2019-02-19 01:33:37

标签: python python-3.x pandas dataframe

我经常使用以下命令删除具有一个具有NAN值的单元格的行:

pos_data = df.iloc[:,[5,6,2]].dropna()

否,我想知道如何保留带有NAN的行,并删除其中一列中没有NAN的所有其他行。 我的数据是熊猫数据框。

谢谢。

2 个答案:

答案 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)]