Предположим следующий фрейм данных foo (построенный здесь с субфреймами для демонстрации):
foo1 = pd.DataFrame({"TIME":(np.arange(1,10,1))})
foo1['Letter'] = 'A'
foo1['Number'] = 50
foo1['Variable1'] = np.random.uniform(10,100, size=len(foo1))
foo1['Variable2'] = np.random.uniform(10,100, size=len(foo1))
foo1['Variable3'] = np.random.uniform(10,100, size=len(foo1))
foo2 = pd.DataFrame({"TIME":(np.arange(1,20,0.5))})
foo2['Letter'] = 'A'
foo2['Number'] = 100
foo2['Variable1'] = np.random.uniform(10,100, size=len(foo2))
foo2['Variable2'] = np.random.uniform(10,100, size=len(foo2))
foo2['Variable3'] = np.random.uniform(10,100, size=len(foo2))
foo3 = pd.DataFrame({"TIME":(np.arange(1,40,2.5))})
foo3['Letter'] = 'B'
foo3['Number'] = 40
foo3['Variable1'] = np.random.uniform(10,100, size=len(foo3))
foo3['Variable2'] = np.random.uniform(10,100, size=len(foo3))
foo3['Variable3'] = np.random.uniform(10,100, size=len(foo3))
foo = pd.concat([foo1,foo2,foo3])
В действительности датафрейм намного больше (миллионы строк). Я хотел бы выполнить некоторые вычисления на базовых подкадрах и назначить результат новому столбцу. Я использую групповые, чтобы разделить их. Затем я хотел бы, например, найти кумулятивное процентное изменение по отношению к первому значению переменной 1, а также к среднему значению всех трех переменных и присвоить его новому столбцу.
В настоящее время я делаю список фреймов данных с помощью groupby, а затем перебираю фреймы данных как таковые:
df_split = [g for _, g in foo.groupby(['Letter','Number'])]
for i,df in enumerate(df_split):
df['Perc1'] = df['Variable1'].pct_change().cumsum()*100
df['MeanPerc'] = df[['Variable1','Variable2','Variable3']].mean(axis=1).pct_change().cumsum()*100
df['Var1Ratio'] = df['TIME'].iloc[0]/df['Variable1']
foo_end = pd.concat(df_split)
Я почти уверен, что есть более эффективный способ сделать это, избегая части списка датафреймов; он становится слишком медленным, когда размер df увеличивается. Но я не могу понять, как выполнить эти вычисления для объекта groupby и назначить их обратно объекту groupby. Расчеты необходимо выполнять для каждого подкадра, так как важна первая запись.
Если это невозможно напрямую с groupby, есть ли более быстрый / лучший способ сделать это?
Буду благодарен за любые предложения: -)