用Python中结转的最后一个观测值正向填充非na值



假设我在数据帧中有一列,如:

colname
Na
Na
Na
1
2
3
4
Na
Na
Na
Na
2
8
5
44
Na
Na

通过比较Series.isna缺失值的值与Series.cumsum的累积和,将GroupBy.transformGroupBy.first一起使用,Series.whereSeries.duplicated:最后一次校正NaN

s = df['colNaNme'].isna().cumsum()
df['colNaNme'] = df.groupby(s)['colNaNme'].transform('first').where(s.duplicated())
print (df)
colNaNme
0        NaN
1        NaN
2        NaN
3        1.0
4        1.0
5        1.0
6        1.0
7        NaN
8        NaN
9        NaN
10       NaN
11       2.0
12       2.0
13       2.0
14       2.0
15       NaN
16       NaN

或者通过反转掩码m并仅处理以下组来仅过滤未丢失的值:

m = df['colNaNme'].isna()
df.loc[~m, 'colNaNme'] = df[~m].groupby(m.cumsum())['colNaNme'].transform('first')
print (df)
colNaNme
0        NaN
1        NaN
2        NaN
3        1.0
4        1.0
5        1.0
6        1.0
7        NaN
8        NaN
9        NaN
10       NaN
11       2.0
12       2.0
13       2.0
14       2.0
15       NaN
16       NaN

groupby:的解决方案

m = df['colNaNme'].isna()
m1 = m.cumsum().shift().bfill()
m2 = ~m1.duplicated() & m.duplicated(keep=False)    
df['colNaNme'] = df['colNaNme'].where(m2).ffill().mask(m)
print (df)
colNaNme
0        NaN
1        NaN
2        NaN
3        1.0
4        1.0
5        1.0
6        1.0
7        NaN
8        NaN
9        NaN
10       NaN
11       2.0
12       2.0
13       2.0
14       2.0
15       NaN
16       NaN

您可以尝试groupbycumsumshifttransform('first'):

>>> df.groupby(df['colname'].isna().ne(df['colname'].isna().shift()).cumsum()).transform('first')
colname
0      NaN
1      NaN
2      NaN
3        1
4        1
5        1
6        1
7      NaN
8      NaN
9      NaN
10     NaN
11       2
12       2
13       2
14       2
15     NaN
16     NaN
>>> 

或者试试类似的东西:

>>> x = df.groupby(df['colname'].isna().cumsum()).transform('first')
>>> x.loc[~x.duplicated()] = np.nan
>>> x
colname
0      NaN
1      NaN
2      NaN
3        1
4        1
5        1
6        1
7      NaN
8      NaN
9      NaN
10     NaN
11       2
12       2
13       2
14       2
15     NaN
16     NaN
>>> 

最新更新