How to do forward filling for each group in pandas

后端 未结 1 378
小鲜肉
小鲜肉 2020-12-09 23:49

I have a dataframe similar to below

id A   B   C   D E
1  2   3   4   5 5
1  NaN 4   NaN 6 7
2  3   4   5   6 6
2  NaN NaN 5   4 1

I want t

相关标签:
1条回答
  • 2020-12-10 00:08

    Use GroupBy.ffill for forward filling per groups for all columns, but if first values per groups are NaNs there is no replace, so is possible use fillna and last casting to integers:

    print (df)
       id    A    B    C  D    E
    0   1  2.0  3.0  4.0  5  NaN
    1   1  NaN  4.0  NaN  6  NaN
    2   2  3.0  4.0  5.0  6  6.0
    3   2  NaN  NaN  5.0  4  1.0
    
    cols = ['A','B','C']
    df[['id'] + cols] = df.groupby('id')[cols].ffill().fillna(0).astype(int)
    print (df)
       id  A  B  C  D    E
    0   1  2  3  4  5  NaN
    1   1  2  4  4  6  NaN
    2   2  3  4  5  6  6.0
    3   2  3  4  5  4  1.0
    

    Detail:

    print (df.groupby('id')[cols].ffill().fillna(0).astype(int))
       id  A  B  C
    0   1  2  3  4
    1   1  2  4  4
    2   2  3  4  5
    3   2  3  4  5
    

    Or:

    cols = ['A','B','C']
    df.update(df.groupby('id')[cols].ffill().fillna(0))
    print (df)
       id    A    B    C  D    E
    0   1  2.0  3.0  4.0  5  NaN
    1   1  2.0  4.0  4.0  6  NaN
    2   2  3.0  4.0  5.0  6  6.0
    3   2  3.0  4.0  5.0  4  1.0
    
    0 讨论(0)
提交回复
热议问题