Skip to content Skip to sidebar Skip to footer

Map Column Birthdates In Python Pandas Df To Astrology Signs

I have a dataframe with a column that includes individuals' birthdays. I would like to map that column to the individuals' astrology sign using code I found (below). I am having tr

Solution 1:

Change previous answer by Series.dt.month_name with lowercase strings:

def zodiac_sign(day, month): 
    # checks month and date within the valid range 
    # of a specified zodiac 
    if month == 'december': 
        return'Sagittarius'if (day < 22) else'capricorn'

    elif month == 'january': 
        return'Capricorn'if (day < 20) else'aquarius'

    elif month == 'february': 
        return'Aquarius'if (day < 19) else'pisces'

    elif month == 'march': 
        return'Pisces'if (day < 21) else'aries'

    elif month == 'april': 
        return'Aries'if (day < 20) else'taurus'

    elif month == 'may': 
        return'Taurus'if (day < 21) else'gemini'

    elif month == 'june': 
        return'Gemini'if (day < 21) else'cancer'

    elif month == 'july': 
        return'Cancer'if (day < 23) else'leo'

    elif month == 'august': 
        return'Leo'if (day < 23) else'virgo'

    elif month == 'september': 
        return'Virgo'if (day < 23) else'libra'

    elif month == 'october': 
        return'Libra'if (day < 23) else'scorpio'

    elif month == 'november': 
        return'scorpio'if (day < 22) else'sagittarius'

dates =  pd.to_datetime(astrology['birthdate'])
y = dates.dt.year
now = pd.to_datetime('now').year
astrology = astrology.assign(month= dates.dt.month_name().str.lower(),
                             day= dates.dt.day,
                             year= y.mask(y > now, y -100))
print (astrology)
    birthdate  answer  YEARMONTH-DAYmonthdayyear01970-03-315197003-31   march   31197011970-05-259197005-25     may   25197021970-06-053197006-05    june    5197031970-08-282197008-28  august   281970

astrology['sign']=astrology.apply(lambdax:zodiac_sign(x['day'],x['month']),axis=1)print(astrology)birthdateanswerYEARMONTH-DAYmonthdayyearsign01970-03-31       51970     03-31march311970   aries11970-05-25       91970     05-25may251970  gemini21970-06-05       31970     06-05june51970  Gemini31970-08-28       21970     08-28august281970   virgo

Solution 2:

You can apply the zodiac_sign function to the dataframe as -

import pandas as pd
from io import StringIO

# Sample
x = StringIO("""birthdate,answer,YEAR,MONTH-DAY
1970-03-31,5,1970,03-31
1970-05-25,9,1970,05-25
1970-06-05,3,1970,06-05
1970-08-28,2,1970,08-28
""")


df = pd.read_csv(x, sep=',')

df['birthdate'] = pd.to_datetime(df['birthdate'])
df['zodiac_sign'] = df['birthdate'].apply(lambda x: zodiac_sign(x.day, x.strftime("%B").lower()))
print(df)

Output:

birthdateanswerYEARMONTH-DAYzodiac_sign01970-03-31       51970     03-31aries11970-05-25       91970     05-25gemini21970-06-05       31970     06-05Gemini31970-08-28       21970     08-28virgo

Post a Comment for "Map Column Birthdates In Python Pandas Df To Astrology Signs"