Carlo Allocca
Carlo Allocca

Reputation: 649

backward filling with condition

I would like to apply a backward filling on a particular column of a dataframe with the following condition: I have that the "colum_A" can assume only four values, called A, B, C, D and, the backward filling should work as in the following:

if the first not NaN is A, then backward_filling with A;

if the first not NaN is B, then backward_filling with B;

if the first not NaN is C, then backward_filling with B;

if the first not NaN is D, then backward_filling with C;

if the column_A only contains NaN, then backward_filling with D

For example:

Input DF:

colum_A
 NaN
 NaN
 B
 B
 C
 C

Output DF:

colum_A
 B
 B
 C
 C
 D
 D

Please, any help would be very appreciated. Best Regards, Carlo

Upvotes: 1

Views: 69

Answers (1)

jezrael
jezrael

Reputation: 862581

I think you need map with bfill by condition:

#get mask for back filling NaNs
m = df['colum_A'].isnull()
d = {'A':'A','B':'B','C':'B','D':'C'}
#D if all values NaN
df['colum_B'] = 'D' if m.all() else np.where(m, df['colum_A'].map(d).bfill(),df['colum_A'])
#alternative
#df['colum_B'] = 'D' if m.all() else df['colum_A'].mask(m, df['colum_A'].map(d).bfill())
print (df)
   colum_A colum_B
0      NaN       B
1      NaN       B
2        B       B
3        A       A
4      NaN       B
5        C       C
6        C       C
7      NaN       C
8      NaN       C
9      NaN       C
10       D       D
11       D       D
12       A       A
13       C       C
14     NaN       A
15       A       A
16     NaN     NaN

Upvotes: 1

Related Questions