【发布时间】: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-join、merging tables with millions of rows
提前感谢您的 cmets 和帮助!
【问题讨论】:
-
你能发布一些测试数据吗?
-
数百万行数据导致问题变得缓慢。您可以生成两个数据框,左侧具有 cusip8(一种 ID 形式)和日期,右侧数据框具有 cusip(相同 ID)和 Period(年-月)以及两个数据字段 value1、value2。我的数据字段上方是 sif 和 si_cover
-
没有数据,这很难诊断。但是您可以尝试将
si_df预处理为groupbycusip,然后使用si_df.get_group(cusip)来避免连续选择命中 -
这是一个绝妙的建议,杰夫!这给了我5倍的速度!!将尝试尽快发布一些测试数据。真的很感激!!
标签: python merge group-by pandas time-series