Reputation: 649
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
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