【问题标题】:Merging two dataframe using ID and asof使用 ID 和 asof 合并两个数据框
【发布时间】:2013-11-09 10:14:17
【问题描述】:

我有两个希望连接在一起的数据框,其中左侧数据框的信息索引按(日期,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

提前感谢您的 cmets 和帮助!

【问题讨论】:

  • 你能发布一些测试数据吗?
  • 数百万行数据导致问题变得缓慢。您可以生成两个数据框,左侧具有 cusip8(一种 ID 形式)和日期,右侧数据框具有 cusip(相同 ID)和 Period(年-月)以及两个数据字段 value1、value2。我的数据字段上方是 sif 和 si_cover
  • 没有数据,这很难诊断。但是您可以尝试将si_df 预处理为groupby cusip,然后使用si_df.get_group(cusip) 来避免连续选择命中
  • 这是一个绝妙的建议,杰夫!这给了我5倍的速度!!将尝试尽快发布一些测试数据。真的很感激!!

标签: python merge group-by pandas time-series


【解决方案1】:

你可以使用the "asof join" feature added to pandas 0.19:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多