假设我有以下学生列表数据,包括他们所在的大学、他们学习的模块以及模块的开始和结束日期(一些“结束日期”为空值表示该课程仍在进行中):
现在,我想要一个表格,其中包括学生姓名、所就读的学校以及在该学校学习的时间长度。我不关心他们学习了哪些模块。也就是说,我想要类似于下面这样的东西:
学生 | 大学 | 模块 | 班级开始日期 | 班级结束日期 |
---|---|---|---|---|
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中,我经过多次尝试后尝试了以下方法,但我认为这种方法似乎过于复杂,尽管它起作用:
进行.groupby(['学生', '大学', '课程'])操作
在第1步输出结果上执行.head(1)和.tail(1),将它们连接起来并删除重复项(这样像“人类火炬”这样只有一条记录的学生不会从.head(1)和.tail(1)中重复出现)
为['student'].shift(-1), ['University'].shift(-1), ['Module'].shift(-1)和['End Date of Class'].shift(-1)分别添加一列
创建一个函数:如果(['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']。应用该函数。
再次对第4步的输出结果执行.head(1),删除['End Date of Class']列,并将['Start Date of Class']列重命名为['Start Date of School']。计算这两个日期之间的天数。同时,删除所有作为过渡步骤创建的很多.shift(-1)列
这是一些直截了当的代码行,我想得到的实际上就是这个。您对可以在这里使用的更直接的方法有什么建议吗?