pandas如何将生日按星座分组
高洛峰
高洛峰 2016-10-22 16:16:37
0
1
804

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

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


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
三叔

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

这样就得到了如上结果


热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!