2016-10-19 186 views
3

我试图计算交叉验证方案内的组平均值,但是这种迭代方法非常慢,因为我的数据帧包含多于1mln的行。是否有可能对此计算进行矢量化?谢谢。向量化大熊猫计算

import pandas as pd 
import numpy as np 
data = np.column_stack([np.arange(1,101), np.random.randint(1,11, 100),np.random.randint(1,101, 100)]) 
df = pd.DataFrame(data, columns=['id', 'group','total']) 
from sklearn.cross_validation import KFold 
kf = KFold(df.shape[0], n_folds=3, shuffle = True) 
f = {'total': ['mean']} 
df['fold'] = 0 
df['group_average'] = 0 
for train_index, test_index in kf: 
    df.ix[train_index, 'fold'] = 0 
    df.ix[test_index, 'fold'] = 1 
    aux = df.loc[df.fold == 0, :].groupby(['group']) 
    aux2 = aux.agg(f) 
    aux2.reset_index(inplace = True) 
    aux2.columns = ['group', 'group_average'] 
    for i, row in df.loc[df.fold == 1, :].iterrows(): 
     new = aux2.ix[(aux2.group == row.group),'group_average'] 
     if new.empty == True: 
      new = 0 
     else: 
      new = new.values[0] 
     df.ix[i, 'group_average'] = new 
+0

您能否提供示例输入和输出数据,以便我们运行您的代码? – Khris

+1

@Khris对不起,我编辑了代码,你现在应该可以运行了。 –

+0

尝试应用lambda函数,但速度更慢。 – Khris

回答

3

与此更换for i, row in df.loc[df.fold == 1, :].iterrows(): -loop:

df0 = pd.merge(df[df.fold == 1],aux2,on='group').set_index('id') 
df = df.set_index('id') 
df.loc[(df.fold == 1),'group_average'] = df0.loc[:,'group_average_y'] 
df = df.reset_index() 

这使我有相同的结果,你的代码是快了近7倍。

+0

谢谢,我正在玩合并,但没有想到这个解决方案。 –