如何在特定范围内的熊猫中选择 NaN 值



>我有一个这样的数据帧:

df = pd.DataFrame({'col1': [5,6,np.nan, np.nan,np.nan, 4, np.nan, np.nan,np.nan, np.nan,7,8,8, np.nan, 5 , np.nan]})
df: 
    col1
0   5.0
1   6.0
2   NaN
3   NaN
4   NaN
5   4.0
6   NaN
7   NaN
8   NaN
9   NaN
10  7.0
11  8.0
12  8.0
13  NaN
14  5.0
15  NaN

应按以下方式替换这些NaN值。第一个选择应如下所示。

2   NaN 
3   NaN
4   NaN
5   4.0
6   NaN
7   NaN
8   NaN
9   NaN

然后,这些Nan值应替换为该选择中的唯一值 4。第二个选择是:

13  NaN
14  5.0
15  NaN

这些NaN值应替换为 5。

使用isnull(),您可以选择数据框中的NaN值,但是如何在熊猫中过滤/选择这些特定范围?

如果缺失值在一个非缺失值周围,则解决方案 - 解决方案创建唯一的组并通过向前和向后填充在组中替换:

#test missing values
s = df['col1'].isna()
#create unique groups
v = s.ne(s.shift()).cumsum()
#count groups and get only 1 value around, filter only misising values groups
mask = v.map(v.value_counts()).eq(1) | s
#groups for replacement per groups
g = mask.ne(mask.shift()).cumsum()    
df['col2'] = df.groupby(g)['col1'].apply(lambda x: x.ffill().bfill())
print (df)
    col1  col2
0    5.0   5.0
1    6.0   6.0
2    NaN   4.0
3    NaN   4.0
4    NaN   4.0
5    4.0   4.0
6    NaN   4.0
7    NaN   4.0
8    NaN   4.0
9    NaN   4.0
10   7.0   7.0
11   8.0   8.0
12   8.0   8.0
13   NaN   5.0
14   5.0   5.0
15   NaN   5.0

最新更新