我有两个数据框,希望将它们连接在一起,其中左侧数据框的信息索引为(日期,ID),而右侧数据框的信息索引为(时段,ID),其中期间为年月。

我最终对左框架按ID进行分组,遍历各组,在右框架上选择相同的分组,然后从左数据帧对分组的索引进行asof操作,如下所示:

def merge_func(base_df, si_df):
    df_list = list()
    by_cusip = base_df.groupby('cusip8')

    for cusip, group in by_cusip:
        si_df_by_cusip = si_df[si_df.cusip==cusip]
        if len( si_df_by_cusip[ pd.notnull(si_df_by_cusip['sif'])]) > 0:
            group['sif'] = si_df_by_cusip['sif'].asof(group.index)
        else:
            group['sif'] = np.nan
        if len( si_df_by_cusip[ pd.notnull(si_df_by_cusip['si_cover'])]) > 0:
            group['sir'] = si_df_by_cusip['si_cover'].asof(group.index)
        else:
            group['sir'] = np.nan
        df_list.append(group)
    return pd.concat(df_list)


但是此功能相当慢。有没有人可以使此合并功能更快,更有效?

您可能会发现这些链接与我要完成的任务有关:sample for doing asof-joinmerging tables with millions of rows

预先感谢您的评论和帮助!

最佳答案

您可以只使用the "asof join" feature added to pandas 0.19

pd.merge_asof(df1, df2, left_on='date', right_on='period', by='ID')

10-04 13:52
查看更多