【发布时间】:2024-01-15 21:09:01
【问题描述】:
我有两个 Multiindex 数据框,即 panel1 和 panel2:两者都有相同的 0 级索引 - 日期,但不同的 1 级索引;请参阅下面的示例代码:
# panel1:
idx1 = pd.MultiIndex.from_product([['2017-05-02', '2017-05-03', '2017-05-04'],['id1', 'id2', 'id3']],names=['Dates', 'id'])
panel1=pd.DataFrame(np.random.randn(9,2), index=idx1,columns=['ytm','mat'])
# panel2:
idx2 = pd.MultiIndex.from_product([['2017-05-02', '2017-05-03', '2017-05-04'],['0.5', '1.5', '2.5']],names=['Dates', 'yr'])
panel2=pd.DataFrame(np.random.randn(9), index=idx2,columns=['curve'])
我想按日期(0 级索引)循环遍历两个面板。因此,对于每一天(例如“2017-05-02”),我在 yr 列(panel2)中搜索每个 id/row(panel1)的 mat ,如果有匹配,我想获取对应的 curve 值(panel2)并将其添加为 panel1 中的新列(名为 CDB)。
我目前的代码如下:
group1=panel1.groupby(level=0)
group2=panel2.groupby(level=0)
lst=[]
for ytm in group1: # loop over each day
for yr in group2: # loop over each day
df_ytm=ytm[1] # get df of id, yt & mat
df_ytm=df_ytm.assign(CDB=np.nan) # add a col of nan, later will be replaced by matched curve values
df_curve=yr[1].reset_index() # need get rid of index to match yr with t_mat
df_curve.yr=df_curve.yr.astype(float)
for i in range(df_ytm.shape[0]): # loop over each row
if (df_ytm.iloc[i,1]==df_curve.yr).any()==True: # search if each 'mat' value in 'yr' column
df_ytm.iloc[i,2]=df_curve[df_curve.yr.isin([df_ytm.t_mat[i]])].curve.values # if matched, set 'CDB' as curve value
lst.append(df_ytm) # need get modified 'df_ytm' (with matched 'CDB')
代码在我尝试使用小样本时有效,但我有一个巨大的面板 1(大小为 800 天乘以 10000 个 ID)和大面板 2。所以代码已经运行了24小时以上。
我想知道如何重写代码(使用可能的矢量化)以加快速度?
任何 cmets 将不胜感激!
【问题讨论】:
标签: python pandas performance vectorization multi-index