将 python pandas df 中的列生日映射到占星术符号

Posted

技术标签:

【中文标题】将 python pandas df 中的列生日映射到占星术符号【英文标题】:Map column birthdates in python pandas df to astrology signs 【发布时间】:2020-08-15 16:09:39 【问题描述】:

我有一个数据框,其中有一列包含个人的生日。我想使用我找到的代码(如下)将该列映射到个人的占星术符号。我无法编写代码来创建变量。

我当前的数据框是这样的

     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

我发现的创建日期映射函数的代码可在此网站上找到:https://www.geeksforgeeks.org/program-display-astrological-sign-zodiac-sign-given-date-birth/

任何提示将不胜感激。

【问题讨论】:

@AMC 那么为什么要投反对票呢?您在 2 个不同的地方这样做了,如果我的回答是一个有用的解决方案,请不要投反对票,如果问题的框架不正确,请投反对票。 【参考方案1】:

用小写字符串Series.dt.month_name 更改之前的答案:

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  YEAR MONTH-DAY   month  day  year
0  1970-03-31       5  1970     03-31   march   31  1970
1  1970-05-25       9  1970     05-25     may   25  1970
2  1970-06-05       3  1970     06-05    june    5  1970
3  1970-08-28       2  1970     08-28  august   28  1970

astrology['sign'] = astrology.apply(lambda x: zodiac_sign(x['day'], x['month']), axis=1)
print (astrology)
    birthdate  answer  YEAR MONTH-DAY   month  day  year    sign
0  1970-03-31       5  1970     03-31   march   31  1970   aries
1  1970-05-25       9  1970     05-25     may   25  1970  gemini
2  1970-06-05       3  1970     06-05    june    5  1970  Gemini
3  1970-08-28       2  1970     08-28  august   28  1970   virgo

【讨论】:

【参考方案2】:

您可以将zodiac_sign 函数应用于数据框 -

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)

输出:

   birthdate  answer  YEAR MONTH-DAY zodiac_sign
0 1970-03-31       5  1970     03-31       aries
1 1970-05-25       9  1970     05-25      gemini
2 1970-06-05       3  1970     06-05      Gemini
3 1970-08-28       2  1970     08-28       virgo

【讨论】:

以上是关于将 python pandas df 中的列生日映射到占星术符号的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配两个 DataFrame 中的特定值并在 Python Pandas 中添加额外的列? [复制]

如何使用现有列中的变量创建数据框作为使用 python 的列?

Pandas 将浮点数附加到 for 循环中的列

Python / Pandas:重命名非常大的数据文件的列

从 pandas df 中的列创建一个二元组

如何从python中的pandas数据框中的列中提取关键字(字符串)