我有两个 Dataframe 。
第一个数据框包含一列名称、日期和一个关于学校的空列。
df1:
姓名日期学校2015年6月24日2017年8月15日2019年12月4日
第二个数据框包含一列名称、他们就读的学校、开始日期和结束日期
df2:
名称开始日期结束日期学校2014年01月01日2013年06月31日阿尔法小学2014年12月01日201431/12/2016beta中学DEREK01/03/201530/07/2015delta小学DEREK01/08/201530/09/2018gamma小学DEREK01/01/2019mu二级学校
我想填写df1中的“学校”栏,填写他们在“日期”栏中反映的日期期间就读的学校。此信息将来自df2。然而,数据中有一些怪癖需要注意:
到今天为止,有些人仍在某所学校。因此,df2中“结束日期”下没有数据(例如,最后一行中的derek)
df1中的某些人在df2中没有记录(例如mary)
在一些罕见的情况下,一些人可以在一个特定的时间在两所学校学习。在这种情况下,我可能只从第一行获取数据
我在df1中有800k行,在df2中有500万行
我尝试了以下代码:
for i in range(len(df1)):
try:
df1.at[i, 'School'] = df2[(df2['Name'] == df1['Name'].iloc[i]) & (df2['Start Date'] < df1['Date'].iloc[i]) & ((df2['End Date'] > df1['Date'].iloc[i]) | (df2['End Date'].isnull())).values[0]
except:
df1.at[i, 'School'] = ""
此代码用于1000行数据的示例。然而,对我来说,它似乎非常复杂,需要花费近5个小时来运行我的全部数据。
有没有其他方法可以更快地获得我想要的结果?
2条答案
按热度按时间t98cgbkg1#
试一试
pandas.merge_asof
:这只是从“开始日期”开始合并
df2
但假设没有重叠的日期,即同一个人没有在同一天上两所学校,这就足够了。jbose2ul2#
避免在python中进行 Dataframe 处理的for循环,使用内置的pandas函数,对于您的情况,下面的线程使用合并和过滤器的方法是更好的链接描述
此外,您还可以参考文章输入链接描述这里的更多细节优化