Pandas groupby, выполнять операции, добавлять результаты в столбец внутри указанного группового кадра данных - PullRequest
0 голосов
/ 22 марта 2019

Предположим следующий фрейм данных 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, есть ли более быстрый / лучший способ сделать это?

Буду благодарен за любые предложения: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...