Pandas groupby, выполняет операции, добавляет результаты в столбец внутри указанного фрейма данных groupby

#python-3.x #pandas #dataframe #pandas-groupby

#python-3.x #pandas #фрейм данных #pandas-groupby

Вопрос:

Предположим, что следующий фрейм данных 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])
  

Фрейм данных на самом деле намного больше (миллионы строк). Я хотел бы выполнить некоторые вычисления для базовых фреймов подданных и присвоить результат новому столбцу. Я использую groupby для их разделения. Затем я хотел бы, например, найти совокупное процентное изменение по отношению к первому значению переменной 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, есть ли более быстрый / лучший способ сделать это?

Я был бы благодарен за любые предложения 🙂

Комментарии:

1. С этим должно быть что-то не так pct_change , поэтому безопасный способ — сделать то, что вы сделали прямо сейчас..

2. что вы имеете в виду, что что-то не так?

3. Проверьте github.com/pandas-dev/pandas/issues/21200 чтобы df.groupby([]).pct_change() не возвращать правильный результат

4. хорошо, но вопрос выходит за рамки .pct_change() . Любые вычисления, которые я хотел бы иметь возможность выполнять в фреймах подданных, поэтому результат .groupby()