我在pandas数据框中有一列,其中某些行具有NaN值。
我想选择满足以下条件的行:
-它们是NaN值;
-它们紧随其后或位于非空值之前
例如,我想选择具有该nan值的行:
输入:
索引|上校
...
1 | 1344
2 | NaN
3 | 532
...
期望的ouptut:
2 | NaN
但是我不想选择这些nan值(因为它们后面跟着一个NaN值,或者紧接另一个NaN值):
索引|上校
...
1 | 1344
2 | NaN
3 | NaN
4 | 532
...
任何帮助将不胜感激
谢谢!
答案 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