如何在python的列中过滤所有包含``隔离的''nan值的行

时间:2019-10-21 12:08:10

标签: python pandas filter nan

我在pandas数据框中有一列,其中某些行具有NaN值。

我想选择满足以下条件的行:
-它们是NaN值;
-它们紧随其后或位于非空值之前

例如,我想选择具有该nan值的行:
输入:

索引|上校

...
1 | 1344
2 | NaN
3 | 532
...

期望的ouptut:
2 | NaN

但是我不想选择这些nan值(因为它们后面跟着一个NaN值,或者紧接另一个NaN值):

索引|上校

...
1 | 1344
2 | NaN
3 | NaN
4 | 532

...

任何帮助将不胜感激

谢谢!

1 个答案:

答案 0 :(得分:0)

下面我将通过示例向您展示如何做到这一点。一方面,Series.notna + Series.cumsum + Series.shift用于对连续的NaN值进行分组通过groupby。使用transform,您可以在具有多个False 的那些组中使用NaN的布尔系列。此布尔系列的AND操作与得到的df2['col2']. isna()系列是我们要执行的Boolean indexing序列,并选择存在NaN但不连续的那些行

df=pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10],'col2':[np.nan,2,3,np.nan,np.nan,6,np.nan,8,9,np.nan]})
print(df)
   col1  col2
0     1   NaN
1     2   2.0
2     3   3.0
3     4   NaN
4     5   NaN
5     6   6.0
6     7   NaN
7     8   8.0
8     9   9.0
9    10   NaN

mask_repeat_NaN=df.groupby(df['col2'].notna().cumsum())['col2'].transform('size').le(2)
mask=mask_repeat_NaN&df['col2'].isna()
df_filtered=df[mask]
print(df_filtered)

   col1  col2
0     1   NaN
6     7   NaN
9    10   NaN