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

时间:2019-07-15 10:16:24

标签: pandas

我有一个这样的数据框:

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值,但是如何过滤/选择这些特定的熊猫范围?

1 个答案:

答案 0 :(得分:4)

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

#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