[英]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
如果先例值為 -999,按 A 列分組,我想在 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
,即前一個值。
使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.