#python #pandas #vectorization #cross-validation
#python #pandas #векторизация #перекрестная проверка
Вопрос:
Я пытаюсь вычислить групповые средние значения внутри схемы перекрестной проверки, но этот метод итерации чрезвычайно медленный, поскольку мой фрейм данных содержит более 1 млн строк. Возможно ли векторизовать это вычисление? Спасибо.
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
Комментарии:
1. Можете ли вы предоставить пример входных и выходных данных, чтобы мы запустили ваш код?
2. @Khris Извините, я отредактировал код, вы должны быть в состоянии запустить его сейчас
3. Пробовал применить лямбда-функцию, но это еще медленнее.
4. Должно
group_average
быть одинаковым значением в каждой группе или оно должно меняться?5. Это должно варьироваться в пределах одной группы из-за разделения на 5 сгибов. Например, среднее значение по группе для 5-й группы должно быть рассчитано с использованием первых 4 сгибов.
Ответ №1:
Замените for i, row in df.loc[df.fold == 1, :].iterrows():
-цикл этим:
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 раз быстрее.
Комментарии:
1. Спасибо, я играл с merge, но не подумал об этом решении.