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.