Python 根据日期组合数据帧

Python 根据日期组合数据帧,python,pandas,Python,Pandas,我有两个数据帧。其中一个包含年份信息,id在此表中始终是唯一的: _id start_date end_date name 0 abdgff374935hgkfeo549353 2018-09-02 00:00:00.000 2019-08-31 00:00:00.000 2018/2019 1 fsjket43538603463u9g

我有两个数据帧。其中一个包含年份信息,id在此表中始终是唯一的:

                        _id               start_date                 end_date               name
0  abdgff374935hgkfeo549353  2018-09-02 00:00:00.000  2019-08-31 00:00:00.000          2018/2019
1  fsjket43538603463u9gregr  2019-09-01 00:00:00.000  2020-07-31 00:00:00.000          2019/2020
我的第二个包含组信息,其中也包含学生信息,有多行具有相同的组id,因为每行链接到不同的学生,当学生进入新组时,多行上的学生id也可以相同:

           _id        student_start_date         student_end_date         student_id
0  fjkgn4783u54  2018-10-01 00:00:00.000  2019-08-31 00:00:00.000      2gbger9tu9834
1  ngregreit495  2019-09-10 00:00:00.000  2020-07-31 00:00:00.000      ghuti43594353
1  ngregreit495  2019-11-05 00:00:00.000  2020-07-31 00:00:00.000      ghuti43594354
1  ngregreit495  2019-09-02 00:00:00.000  2020-07-31 00:00:00.000      ghuti43594357
我尝试重新创建的是下表,该表将年份名称添加到“组”表中:

           _id        student_start_date         student_end_date         student_id     year_name
0  fjkgn4783u54  2018-10-01 00:00:00.000  2019-08-31 00:00:00.000      2gbger9tu9834     2018/2019
1  ngregreit495  2019-09-10 00:00:00.000  2020-07-31 00:00:00.000      ghuti43594353     2019/2020
有人知道我如何循环浏览groups表和years表,找出哪些组数据适合哪一年吗

这是我目前所掌握的,但速度很慢:

            for i in Years.index: 
                StartDate = Years.loc[i,'start_date']
                EndDate = Years.loc[i,'end_date']
                YearName = Years.loc[i,'name']
                print(YearName)
                for i in groups.index:
                    StudentStartDate = groups.loc[i,'student_start_date']
                    StudentEndDate = groups.loc[i,'student_end_date']
                    GroupName = groups.loc[i,'name']
                    try:
                        if (StartDate <= StudentStartDate <= EndDate):
                            groups.loc[i,'YearName'] = YearName
                    except TypeError:
                        pass
                    try:
                        if (StartDate <= StudentEndDate <= EndDate):
                            groups.loc[i,'YearName'] = YearName
                    except TypeError:
                        pass
以年为单位的i的
。索引:
起始日期=年。loc[i,'开始日期']
EndDate=年。loc[i,'end_date']
deargename=Years.loc[i,'name']
打印(名称)
对于组中的i.index:
StudentStartDate=groups.loc[i,'student\u start\u date']
StudentEndDate=groups.loc[i,'student\u end\u date']
GroupName=groups.loc[i,'name']
尝试:

如果(StartDate如果我理解正确,您正在寻找以下内容:


作为pd进口熊猫
#这是您问题中的第一个数据帧
d={“uID”:[ABDFF374935HGKFEO549353','FSJKET45383603463U9GREGR'],
“开始日期”:2018-09-02、“2019-09-10”,
‘结束日期’:[‘2019-08-31’、‘2020-07-31’,
‘名称’:[‘2018/2019’、‘2019/2020’]}
df_dates=pd.DataFrame(data=d)
#这是您问题中的第二个数据帧
d={“U id”:[fjkgn4783u54',ngregreit495'],
“学生开始日期”:[“2018-10-01”、“2019-09-10”],
‘学生结束日期’:[‘2019-08-31’、‘2020-07-31’,
“学生id”:[2gbger9tu9834',ghuti43594353']
df_学生=pd.DataFrame(数据=d)
#一行替换for循环,该循环生成问题中的第三个表

df_学生['year_name']=df_dates[(df_dates.start_date我对显示的学生数据框中的最后一行有一个主要问题:学生开始日期是2019-09-02,而年份开始日期是2019-09-10。这意味着学生在年初之前进入了一个组

如果排除该行,我可以使用
向后方向执行
pd.merge\u asof

resul = pd.merge_asof(df2.sort_values('student_start_date'), df1,
                      right_on='start_date', left_on='student_start_date')
它给出:

            _id student_start_date student_end_date     student_id                     _id_y start_date   end_date       name
0  fjkgn4783u54         2018-10-01       2019-08-31  2gbger9tu9834  abdgff374935hgkfeo549353 2018-09-02 2019-08-31  2018/2019
1  ngregreit495         2019-09-10       2020-07-31  ghuti43594353  fsjket43538603463u9gregr 2019-09-10 2020-07-31  2019/2020
2  ngregreit495         2019-11-05       2020-07-31  ghuti43594354  fsjket43538603463u9gregr 2019-09-10 2020-07-31  2019/2020

现在,您可以删除不需要的列以获得预期的数据帧…

而不是合并数据帧,您可以轻松地计算年份名称。请参阅。如果您想使用现有列,因此有很多方法。谢谢@rajah9,但有时我的年份有不同的开始/结束日期,因此我需要它来检查学生的开始/结束日期是否为b在我的年份开始日期和结束日期之间找到正确的年份谢谢,但是我在尝试代码时遇到了这个错误:ValueError:只能比较相同标签的系列对象您使用的pandas版本是哪个?我的版本是0.24.2,它可以工作。您可以使用
pip list
.0.25.1查看版本。我认为错误是因为dataframes有多行。years表包含5个不同的年份,groups表包含50多个组,每个组中有多个学生。我已经安装了0.25.1版,并且仍然有效。您是否在自己的脚本中尝试了该片段(除了代码之外)?是的,它适用于您的数据,但我的数据必须采用不同的格式或其他方式?您的数据是否像我的数据一样打印出来?抱歉,这一定是一个异常日期,这是错误的。如果学生在一年中开始或离开一个组而不是在开始时,这仍然有效吗?如果学生开始日期为空,并且需要查看螺柱,我该怎么办是否改为ent\U end\U date?@Pippa97当前,合并asof搜索的
start\u date
值高于或等于
student\u start\u date
。由于我没有添加进一步的控件,因此错误地认为前一年是student\u start\u date,刚好在年start\u date之前,这就是我删除该行的原因ded学生开始日期在学年开始日期之后,应该可以使用。谢谢@Serge Ballesta,但是我收到了这个错误-TypeError:找不到匹配的签名。@Pippa97:我猜不出是什么导致了这个错误。也许你可以打开一个新的问题来引用这个问题。这样,你可以提供一个简短的摘录来展示这个问题,代码引发错误(包括
合并\u asof
)和完整堆栈跟踪。如果现在编辑此错误,当前答案将变得不相关。。。