如何有条件地查找数据框中给定日期之后的较早日期?

我正在尝试在两个数据帧之间查找一系列 ID。


Lookup_df 中的每个 ID 都有一个发布日期,我需要查找 ref_df 中相对于 Lookup_df 日期的最后日期。


在下面的示例中,lookup_df ID 123 于 20200218 发布,因此在 ref_df 中的日期中,我只需要查看 ID 为 123 的日期,并找到在此之前的最后一个日期,即 20200201。


我已经尝试了各种循环,但无法完成这项工作,并且真实的数据库超过 600k 行,所以我担心我当前的方法(创建临时 DF 然后循环)会导致完成此操作所需的运行时间不切实际。


ref_df = pd.DataFrame({'ID':[123,123,123,345,345,345],'version':['version1','version2','version3','version4','version5','version6'],

                       'date effective from':['20200101','20200201','20200301','20200401','20200501','20200601',]})

print(ref_df)


lookup_df = pd.DataFrame({'ID':[123,345],'date':['20200218','20200522']})

print(lookup_df)


for index, row in lookup_df.iterrows():

    temp_df = ref_df[ref_df['ID']==row['ID']]

    for index2, row2 in temp_df:

        #some code here to find the right date?!


编辑 - 抱歉无法直接显示表格,这是我不熟悉如何格式化我的问题的功能 - 感谢指点!


扬帆大鱼
浏览 125回答 3
3回答

皈依舞

这是一个使用的选项last_valid_index():idx = [ref_df.loc[ref_df['ID'] == value].last_valid_index() -   1 for value in lookup_df['ID']]print(ref_df.loc[idx])编辑:删除循环mask = ref_df['ID'].isin(lookup_df['ID'])new_df = ref_df[mask].groupby('ID').apply(lambda x: x.iloc[-2])print(new_df)

富国沪深

更改date effective from为date并尝试以下操作:for index, row in lookup_df.iterrows():&nbsp; &nbsp; result = ref_df.loc[(ref_df['ID'] == row['ID']) & (ref_df['date'] < row['date'])].iloc[-1,:].values[-1]&nbsp; &nbsp; print(result)输出:2020020120200501

尚方宝剑之说

您可以首先使用lookup_df以下命令获取“最新”日期:latest = lookup_df[lambda x: x.ID == ID]['date'].iloc[0]有了这个“最新”日期,我们可以进行另一个查询ref_df以获得所需的结果:result = ref_df[lambda x: x.ID == ID]\&nbsp; &nbsp; [lambda x: x['date effective from'] < date]\&nbsp; &nbsp; ['date effective from']\&nbsp; &nbsp; .iloc[-1]&nbsp; &nbsp;&nbsp;要对 中的所有 ID 执行相同的操作lookup_df,请将其包装在代码中,如下所示:for _, row in lookup_df.iterrows():&nbsp; &nbsp; ID, date = row['ID', 'date']&nbsp; &nbsp; result = ref_df[lambda x: x.ID == ID]\&nbsp; &nbsp; &nbsp; &nbsp; [lambda x: x['date effective from'] < date]\&nbsp; &nbsp; &nbsp; &nbsp; ['date effective from']\&nbsp; &nbsp; &nbsp; &nbsp; .iloc[-1]&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;您不需要迭代 中的所有行ref_df,请使用如下所示的过滤器:df[<some condition here>]或者例如:df[df['idx'] > 3]返回其中列大于 3 的所有df行idx。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python