我有两个DataFrame:df1和df2
df1和df2都来自相同的原始数据集,该数据集具有DatetimeIndex。
df2仍然具有DatetimeIndex。
鉴于df1已过采样,现在具有int索引,其中先前的DatetimeIndex作为其中的“日期”列。
我需要重建一个df2以使其与df1对齐,即,我需要对被过度采样的行进行过度采样,然后对其进行排序,并将它们设置为与df1相同的int索引。
当前,我在下面使用这两个函数,但它们的运行速度很慢。有什么办法可以加快速度吗?我还没有找到执行此操作的内置函数。有吗?
def align_data(idx_col,data):
new_data = pd.DataFrame(index=idx_col.index,columns=data.columns)
for label,group in idx_col.groupby(idx_col):
if len(group.index) > 1:
slice = expanded(data.loc[label],len(group.index)).values
else:
slice = data.loc[label]
new_data.loc[group.index] = slice
return new_data
def expanded(row,l):
return pd.DataFrame(data=[row for i in np.arange(l)],index=np.arange(l),columns=row.index)
可以使用以下代码生成测试:
import pandas as pd
import numpy as np
import datetime as dt
dt_idx = pd.DatetimeIndex(start='1990-01-01',end='2018-07-02',freq='B')
df1 = pd.DataFrame(data=np.zeros((len(dt_idx),20)),index=dt_idx)
df1.index.name = 'Date'
df2 = df1.copy()
df1 = pd.concat([df1,df1.sample(len(dt_idx)/2)],axis=0)
df1.reset_index(drop=False,inplace=True)
t = dt.datetime.now()
df2_aligned = align_data(df1['Date'],df2)
print(dt.datetime.now()-t)