python - pandas如何将生日按星座分组

 pan2502851807 发布于 2022-10-28 01:38

如题,有两点不明,还请大牛指导:

1.如何忽略生日中的年份只比较月和日
2.摩羯座是跨越两个年份的(12-22,1-19),如何处理呢

series

        birthday
    0    2008-06-08
    1    2008-11-09
    2    2013-10-12
    3    2002-09-28
    4    2007-10-24
    5    2012-08-27
    6    2005-08-22
    7    2008-04-12
    8    2001-06-29
    9    2009-07-23

dataframe

        constellationt    start    end
    0    白羊座    3-21    4-19
    1    金牛座    4-20    5-20
    2    双子座    5-21    6-21
    3    巨蟹座    6-22    7-22
    4    狮子座    7-23    8-22
    5    处女座    8-23    9-22
    6    天秤座    9-23    10-23
    7    天蝎座    10-24    11-21
    8    射手座    11-22    12-21
    9    摩羯座    12-22    1-19
    10    水瓶座    1-20    2-18
    11    双鱼座    2-19    3-20
2 个回答
  • 不懂简单算法,复杂版本就是先比较月份,然后比较日期,定位到星座。逻辑简单,代码好复杂。。。
    忽略年份,所以快年也不是问题。

    2022-10-29 08:55 回答
  • 这是一道数据整形题,既然用到了Pandas就尽量避免循环,多用向量化的思想。

    我们的目标是

         birthday     month   mon test
    0  2008-06-08  20080608   608  双子座
    1  2008-11-09  20081109  1109  天蝎座
    2  2013-10-12  20131012  1012  天秤座
    3  2002-09-28  20020928   928  天秤座
    4  2007-10-24  20071024  1024  天蝎座
    5  2012-08-27  20120827   827  处女座
    6  2005-08-22  20050822   822  狮子座
    7  2008-04-12  20080412   412  白羊座
    8  2001-06-29  20010629   629  巨蟹座
    9  2009-07-23  20090723   723  狮子座

    这个结构已经暴露了我们将要通过数值比较大小来确定所在星座的范围

    经过处理

       constellationt  start    end     s     e
    0             白羊座   3-21   4-19   321   419
    1             金牛座   4-20   5-20   420   520
    2             双子座   5-21   6-21   521   621
    3             巨蟹座   6-22   7-22   622   722
    4             狮子座   7-23   8-22   723   822
    5             处女座   8-23   9-22   823   922
    6             天秤座   9-23  10-23   923  1023
    7             天蝎座  10-24  11-21  1024  1121
    8             射手座  11-22  12-21  1122  1221
    9             摩羯座  12-22   1-19  1222   119
    10            水瓶座   1-20   2-18   120   218
    11            双鱼座   2-19   3-20   219   320

    这样的一个数据组用apply是很方便做到的,接下来构思星座范围判断的逻辑,

    分为三种,1 日期恰好在边界 2 日期在范围以内 3摩羯座的特殊情况

    def f(mon,cons):
        test = mon > cons[['s','e']]
        test0 = mon == cons[['s','e']]
        t0 = test0[test0.s|test0.e]
        t1 = test[test.s&-test.e]
        if not t0.empty:
            return cons.ix[t0.index].constellationt.iat[0]
        if not t1.empty:
            return cons.ix[t1.index].constellationt.iat[0]
        if test.s.all() and test.e.all():
            return cons.ix[[9]].constellationt.iat[0]

    最后

    birth['test'] = birth.mon.apply(lambda x:f(x,cons))

    这样就得到了如上结果

    2022-10-29 08:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有