python—通过引用另一个 Dataframe (带日期)填充列

93ze6v8z  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(357)

我有两个 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个小时来运行我的全部数据。
有没有其他方法可以更快地获得我想要的结果?

t98cgbkg

t98cgbkg1#

试一试 pandas.merge_asof :

df1["Date"] = pd.to_datetime(df1["Date"], format="%d/%m/%Y")
df2["Start Date"] = pd.to_datetime(df2["Start Date"], format="%d/%m/%Y")
df2["End Date"] = pd.to_datetime(df2["End Date"], format="%d/%m/%Y")

>>> df1["School"] = pd.merge_asof(df1, df2, left_on="Date", right_on="Start Date", by="Name")["School_y"]

这只是从“开始日期”开始合并 df2 但假设没有重叠的日期,即同一个人没有在同一天上两所学校,这就足够了。

jbose2ul

jbose2ul2#

避免在python中进行 Dataframe 处理的for循环,使用内置的pandas函数,对于您的情况,下面的线程使用合并和过滤器的方法是更好的链接描述
此外,您还可以参考文章输入链接描述这里的更多细节优化

相关问题