So I wanna fill NaN value of the pay date with the date one month after the join date.
Join date | Payday1 |
---|---|
Okt’10 | NaN |
Des’10 | NaN |
My expectation output is:
Join date | Payday1 |
---|---|
Okt’10 | Nov’10 |
Des’10 | Jan’11 |
I try this code:
months = ["Jan", "Feb", "Mar", "Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"]
dateIn="Okt'10"
def fill_date():
dateIn=dateIn.split("'")
month, year= dateIn[0], int(dateIn[1])
if month == months[len(months)-1]:
year+=1
month=months[0]
else:
for m in months:
if m == month:
month=months[months.index(month)+1]
dateOut=f"{month} {year}"
df['Payday1'] = df['Payday1'].apply(fill_date)
This code is error in this code month=months[months.index(month)+1], it said list index out of range
. So how to fix this code ?
Advertisement
Answer
I see two methods:
First: add second Jan
at the end of list months
and this may work.
Second: use break
inside for
-loop to exit it when you find first matching element.
All problem is because inside if m == month
you assign new value to month
and in next loops the same line if m == month
compares with different value in month
and it may compare with Des
and tor to get elemenet after Des
. But if you use break
then it will exit afer finding first matching value (and it will not check if m == month
for new value).
Full working code with other changes – ie. you fogot return dateOut
in your code.
months = ["Jan", "Feb", "Mar", "Apr","Mei","Jun","Jul","Agt","Sep","Okt","Nov","Des"]
dateIn = "Okt'10"
import pandas as pd
df = pd.DataFrame({
'Join date': ["Okt'10", "Des'10"],
'Payday1': ["NaN", "NaN"],
})
def fill_date(dateIn):
print(dateIn)
dateIn = dateIn.split("'")
month, year = dateIn[0], int(dateIn[1])
if month == months[-1]:
year += 1
month = months[0]
else:
for m in months:
if m == month:
month = months[months.index(month)+1]
break # <--- HERE
dateOut = f"{month}'{year}"
return dateOut
df['Payday1'] = df['Join date'].apply(fill_date)
print(df)
Result:
Join date Payday1
0 Okt'10 Nov'10
1 Des'10 Jan'11
Probably problem could resolve also for m in months[:-1]:
to skip Des
from list.