Python 以有效方式安装平衡面板(向前填充)

Python 以有效方式安装平衡面板(向前填充),python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个问题,我想平衡一下 数据类型包括: TIME_M datetime64[ns] genesis datetime64[ns] SYM_ROOT category BEST_BID float64 BEST_ASK float64 judgement datetime64[ns] DATE int64 TIME_S obj

我有一个问题,我想平衡一下

数据类型包括:

TIME_M        datetime64[ns]
genesis       datetime64[ns]
SYM_ROOT            category
BEST_BID             float64
BEST_ASK             float64
judgement     datetime64[ns]
DATE                   int64
TIME_S                object
MIDPRICE             float64
bps                  float64
spread               float64
diff         timedelta64[ns]
diff_sec               int64
increment              int64
dtype: object
我要平衡的变量是
increment
。我希望所有
增量
之间没有间隙(即
增量
不能是
1,2,5
,必须是
1,2,3,4,5
)。在只有
1,2,5
的情况下,我想用
increment
等于
3
4
的行填充
increment
等于
2
的行,即向前填充

除此之外,我希望在SYM_根和日期组中进行正向填充

然而,我的扩展函数却非常低效

def expand_gap(x):
    #function to expand gaps 
    #iterate through to find gaps
    x['tmp_diff']=x['increment'].shift(-1)-x['increment']
    tmp_df=x[x['tmp_diff']>1]
    for i in range (0, len(tmp_df)):
        expand_incre = tmp_df.iloc[i,tmp_df.columns.get_loc('increment')]
        target_incre = tmp_df.iloc[i,tmp_df.columns.get_loc('increment')]+tmp_df.iloc[i,tmp_df.columns.get_loc('tmp_diff')]
        while (target_incre-expand_incre)>1:
            tmp_row=tmp_df.iloc[i:i+1]
            new_row=tmp_row.copy()
            expand_incre=expand_incre+1
            new_row['increment'].iloc[0]=expand_incre
            x=x.append(new_row)
    return x

df=df.groupby(['SYM_ROOT','DATE']).apply(expand_gap)
平衡1000000行数据需要很长时间。然而,在现实中,我需要平衡的数据要多得多。你知道如何实现有效的平衡吗

我知道它与附加到数据帧有关,这是一个缓慢的操作


你知道如何有效地做吗

也许您可以先创建一个数据帧,根据需要填充“increment”列

max_lim = 20
my_list=list(range(1,max_lim))
my_array = np.array(my_list).reshape(max_lim-1, 1)
df = pd.DataFrame(my_array, columns=["increment"])
然后,您可以将其与数据帧连接起来

df=df.merge(tmp_df)
之后,您应该能够使用fillna实现您的目标:

df.fillna(method='ffill', inplace=True)

也许您可以先创建一个数据框,根据需要填充“increment”列

max_lim = 20
my_list=list(range(1,max_lim))
my_array = np.array(my_list).reshape(max_lim-1, 1)
df = pd.DataFrame(my_array, columns=["increment"])
然后,您可以将其与数据帧连接起来

df=df.merge(tmp_df)
之后,您应该能够使用fillna实现您的目标:

df.fillna(method='ffill', inplace=True)

我把max_lim=20作为例子,它应该是max(tmp_df.increment)。您应该只有两个数据帧要连接,df和temp_dfI认为它应该是外部连接,并将键指定为
increment
?我试图编辑它,但不知怎么被拒绝了…
df=df.merge(tmp_-df,on=“increment”,how=“outer”)
@Giuseppe bonavatiyes,你需要外部连接-或左连接。我认为增量是不必要的,因为id是两个数据帧之间共享的唯一列。我是否通过每个组连接它?我将max_lim=20作为示例,它应该是max(tmp_df.increment)。您应该只有两个数据帧要连接,df和temp_dfI认为它应该是外部连接,并将键指定为
increment
?我试图编辑它,但不知怎么被拒绝了…
df=df.merge(tmp_-df,on=“increment”,how=“outer”)
@Giuseppe bonavatiyes,你需要外部连接-或左连接。我认为增量是不必要的,因为id是两个数据帧之间共享的唯一列。