Python - 通过类别获取第一行的开始日期和最后一行的结束日期

3
假设我有以下学生列表数据,包括他们所在的大学、他们学习的模块以及模块的开始和结束日期(一些“结束日期”为空值表示该课程仍在进行中):
学生 大学 模块 班级开始日期 班级结束日期
Wanda Xavier's School for Gifted 心灵感应 02-Jan-2018 05-Feb-2018
Wanda Xavier's School for Gifted 心灵感应 06-Feb-2018 10-Apr-2018
Wanda Avengers Assemble University 飞行 01-May-2018 30-Jun-2018
Vision Avengers Assemble University 飞行 01-May-2018 30-Jun-2018
Vision Avengers Assemble University 密度操纵 01-Jul-2018
Human Torch Fantastic Four School 飞行 02-Jan-2018 04-Apr-2018
现在,我想要一个表格,其中包括学生姓名、所就读的学校以及在该学校学习的时间长度。我不关心他们学习了哪些模块。也就是说,我想要类似于下面这样的东西:
学生 大学 入学日期 毕业日期 在校天数
旺达 Xavier天才学校 2018年1月2日 2018年4月10日 99
旺达 复仇者集结大学 2018年5月1日 2018年6月30日 61
幻视 复仇者集结大学 2018年5月1日 未知 持续中
人火 神奇四侠学校 2018年1月2日 2018年4月4日 93

如何最好地实现这一点呢?在Python中,我经过多次尝试后尝试了以下方法,但我认为这种方法似乎过于复杂,尽管它起作用:

  1. 进行.groupby(['学生', '大学', '课程'])操作

  2. 在第1步输出结果上执行.head(1)和.tail(1),将它们连接起来并删除重复项(这样像“人类火炬”这样只有一条记录的学生不会从.head(1)和.tail(1)中重复出现)

  3. 为['student'].shift(-1), ['University'].shift(-1), ['Module'].shift(-1)和['End Date of Class'].shift(-1)分别添加一列

  4. 创建一个函数:如果(['student'] == ['student'].shift(-1)) AND (['University'] == ['University'].shift(-1)) AND (['Module'] == ['Module'].shift(-1)),则['End Date of School'] = ['End Date of Class'].shift(-1)。否则,['End Date of School'] =['End Date of Class']。应用该函数。

  5. 再次对第4步的输出结果执行.head(1),删除['End Date of Class']列,并将['Start Date of Class']列重命名为['Start Date of School']。计算这两个日期之间的天数。同时,删除所有作为过渡步骤创建的很多.shift(-1)列

这是一些直截了当的代码行,我想得到的实际上就是这个。您对可以在这里使用的更直接的方法有什么建议吗?

1个回答

2
您可以直接使用groupby和命名聚合,然后计算天数:
dg = df.groupby(['Student ', 'University '])[['Start Date of Class ','End Date of Class']].agg(
        {'Start Date of Class ': 'min', 'End Date of Class': 'max'}).reset_index()
dg['No. of Days in School'] = dg['End Date of Class'] - dg['Start Date of Class '] + 1

它会产生以下结果:

       Student                     University  Start Date of Class  End Date of Class No. of Days in School
0  Human Torch          Fantastic Four School            2018-01-02        2018-04-04               93 days
1       Vision   Avengers Assemble University            2018-05-01        2018-09-30              153 days
2        Wanda   Avengers Assemble University            2018-05-01        2018-06-30               61 days
3        Wanda     Xavier's School for Gifted            2018-01-02        2018-04-10               99 days

谢谢!我不知道命名聚合。但是如果“课程结束日期”有一些空/空值(例如,课程仍在进行中),那该怎么办?最大日期的聚合将不起作用。对于没有在问题中提及这个细节,我表示歉意。 - user13399233
1
@user13399233:一个技巧是用日期填充缺失的结束值。如果您想要合理的值,可以使用学年末预期的结束日期,或者使用一个遥远的日期(超过1年)。然后,您将此日期替换为NaT,并且天数大于365(如果您可能有更长的学校周期,请使用10年和3650) - Serge Ballesta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接