pandas如何将生日按星座分组

发布于 2022-09-04 00:56:13 字数 821 浏览 11 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

疧_╮線 2022-09-11 00:56:13

这是一道数据整形题,既然用到了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))

这样就得到了如上结果

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文