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