Noor Dean
Noor Dean

Reputation: 19

Replace values in a list by the preceding value in pandas

I have the following dataframe:

df1 = pd.DataFrame({'Name':['Aaron Lopez','Mon','Tue','Wed','Thu','Fri','Sat','Sun', 'Date',
                            'Adan Gabriel','Mon','Tue','Wed','Thu','Fri','Sat','Sun', 'Date']})

I would like to replace the days names by the person's name who comes immediately before the day.

I would like to see:

Name
Aaron Lopez
Aaron Lopez
Aaron Lopez
Aaron Lopez
Aaron Lopez
Aaron Lopez
Aaron Lopez
Aaron Lopez
Adan Gabriel
Adan Gabriel
Adan Gabriel
Adan Gabriel
Adan Gabriel
Adan Gabriel
Adan Gabriel
Adan Gabriel

Upvotes: 1

Views: 24

Answers (2)

wwnde
wwnde

Reputation: 26676

Select df.Name=='Date' or where when df.Name is converted into datetime does not result into a NaN value. After selection, make the True Values NaNs. All the days of the week and the Date will be NaN. Then forward fill using fillna.

import numpy as np
df1=df1.assign(Name=np.where((pd.to_datetime(df1.Name, format='%a', errors='coerce')).notna()|df1.Name.eq('Date'),np.nan,df1.Name))
df1['Name']=df1.Name.ffill()



   Name
0    Aaron Lopez
1    Aaron Lopez
2    Aaron Lopez
3    Aaron Lopez
4    Aaron Lopez
5    Aaron Lopez
6    Aaron Lopez
7    Aaron Lopez
8    Aaron Lopez
9   Adan Gabriel
10  Adan Gabriel
11  Adan Gabriel
12  Adan Gabriel
13  Adan Gabriel
14  Adan Gabriel
15  Adan Gabriel
16  Adan Gabriel
17  Adan Gabriel

Upvotes: 1

Quang Hoang
Quang Hoang

Reputation: 150735

You can use mask then ffill:

mask = df1['Name'].eq('Date').shift(fill_value=0).cumsum()

df1['Name'] = df1['Name'].mask(mask.duplicated()).ffill()

Output:

            Name
0    Aaron Lopez
1    Aaron Lopez
2    Aaron Lopez
3    Aaron Lopez
4    Aaron Lopez
5    Aaron Lopez
6    Aaron Lopez
7    Aaron Lopez
8    Aaron Lopez
9   Adan Gabriel
10  Adan Gabriel
11  Adan Gabriel
12  Adan Gabriel
13  Adan Gabriel
14  Adan Gabriel
15  Adan Gabriel
16  Adan Gabriel
17  Adan Gabriel

Upvotes: 0

Related Questions