#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()