I have df:
id number
1 5
1 0
1 0
1 2
2 0
3 1
I want to write a function to fill 0 values.I want for each id(for each group) , when the value in number column is zero, to search the closet non zero value in the column and return the value. for example to id 1 to fill the second and third-row with 2. If I dont have such value like in id 2 , just to remain it as is. How can I do that? thanks
CodePudding user response:
You can mask
the 0, bfill
per group, finally fillna with then original value for the groups than only have zeros:
df['number2'] = (df['number']
.mask(df['number'].eq(0))
.groupby(df['id'])
.bfill()
.fillna(df['number'], downcast='infer')
)
output:
id number number2
0 1 5 5
1 1 0 2
2 1 0 2
3 1 2 2
4 2 0 0
5 3 1 1