python 条件分组填充

python conditional grouped ffill

In [179]: test = pd.DataFrame({'A': [1,1,1,2,2,2,2,3,3,4,4], 'B': [-999, np.nan, np.nan, 3
     ...: , np.nan, -999, np.nan, 5,-999,np.nan, 3]})                                     

In [180]: test                                                                            
Out[180]: 
    A      B
0   1 -999.0
1   1    NaN
2   1    NaN
3   2    3.0
4   2    NaN
5   2 -999.0
6   2    NaN
7   3    5.0
8   3 -999.0
9   4    NaN
10  4    3.0

如果先例值是按 A 列分组的 -999,我想在 B 列中填充 nan 值

期望的结果:

Out[181]: 
    A      B
0   1 -999.0
1   1 -999.0
2   1 -999.0
3   2    3.0
4   2    NaN
5   2 -999.0
6   2 -999.0
7   3    5.0
8   3 -999.0
9   4    NaN
10  4    3.0

我使用 iterrows 检查每一行,但是......我的真实 df 有 1M 行

谢谢

fillvals = df.groupby('A').ffill()
df['B'].fillna(fillvals[fillvals.eq(-999)]['B'], inplace=True)

结果:

    A      B
0   1 -999.0
1   1 -999.0
2   1 -999.0
3   2    3.0
4   2    NaN
5   2 -999.0
6   2 -999.0
7   3    5.0
8   3 -999.0
9   4    NaN
10  4    3.0

df.groupby('A').ffill() 将用以前的值填充任何 NaN 值,保留该帧的副本。

fillvals[fillvals.eq(-999)]['B'] to filter the indices that are only-999`,即前面的值。

使用fillna从过滤后的帧中填充这些-999

test['B'] = (
    test['B'].fillna(test.groupby('A').B.ffill().where(lambda x: x.eq(-999)))
)

    A   B
0   1   -999.0
1   1   -999.0
2   1   -999.0
3   2   3.0
4   2   NaN
5   2   -999.0
6   2   -999.0
7   3   5.0
8   3   -999.0
9   4   NaN
10  4   3.0