簡體   English   中英

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

如果先例值為 -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM