не знает о других группах.

мере издокументация панд о новом.pipe() метод для объектов GroupBy,.apply() метод, принимающий ту же самую лямбду, возвратил бы те же самые результаты.

In [195]: import numpy as np

In [196]: n = 1000

In ,[197]: df = pd.DataFrame({'Store': np.random.choice(['Store_1', 'Store_2'], n),
   .....:                    'Product': np.random.choice(['Product_1', 'Product_2', 'Product_3'], n),
   .....:                    'Revenue': (np.random.random(n)*50+10).round(2),
   .....:                    'Quantity': np.random.randint(1, 10, size=n)})

In [199]: (df.groupby(['Store', 'Product'])
   .....:    .pipe(lambda grp: grp.Revenue.sum()/grp.Quantity.sum())
   .....:    .unstack().round(2))

Out[199]: 
Product  Product_1  Product_2  Product_3
Store                                   
Store_1       6.93       6.82       7.15
Store_2       6.69       6.64       6.77

Я вижу, какpipe функциональность отличается отapply для объектов DataFrame, но не для объектов GroupBy. У кого-нибудь есть объяснение или примеры того, что можно сделать сpipe но не сapply для группы?

Ответы на вопрос(1)

Решение Вопроса

pipe делает это, чтобы позволить вам передать вызываемый с ожиданием, что объект, который вызвалpipe это объект, который передается вызываемой.

С участиемapply мы предполагаем, что объект, который вызываетapply имеет подкомпоненты, каждый из которых будет передан вызываемому элементу, который был переданapply, В контекстеgroupby подкомпоненты представляют собой фрагменты информационного кадра, который называетсяgroupby где каждый фрагмент представляет собой сам фрейм данных. Это аналог для серииgroupby.

Основное различие между тем, что вы можете сделать сpipe вgroupby контекст заключается в том, что у вас есть доступный для вызова всей области действияgroupby объект. Для подачи заявки вы знаете только о местном срезе.

Настроить
Рассмотреть возможностьdf

df = pd.DataFrame(dict(
    A=list('XXXXYYYYYY'),
    B=range(10)
))

   A  B
0  X  0
1  X  1
2  X  2
3  X  3
4  Y  4
5  Y  5
6  Y  6
7  Y  7
8  Y  8
9  Y  9

Пример 1
Сделать весь'B' сумма столбца в1 в то время как каждая подгруппа подводит одинаковую сумму. Это требует, чтобы при расчете было известно, сколько существует групп. Это то, что мы не можем сделать сapply потому чтоapply не знаю, сколько существует групп.

s = df.groupby('A').B.pipe(lambda g: df.B / g.transform('sum') / g.ngroups)
s

0    0.000000
1    0.083333
2    0.166667
3    0.250000
4    0.051282
5    0.064103
6    0.076923
7    0.089744
8    0.102564
9    0.115385
Name: B, dtype: float64

Примечание:

s.sum()

0.99999999999999989

А также:

s.groupby(df.A).sum()

A
X    0.5
Y    0.5
Name: B, dtype: float64

Пример 2
Вычтите среднее значение одной группы из значений другой. Опять же, это не может быть сделано сapply потому чтоapply не знает о других группах.

df.groupby('A').B.pipe(
    lambda g: (
        g.get_group('X') - g.get_group('Y').mean()
    ).append(
        g.get_group('Y') - g.get_group('X').mean()
    )
)

0   -6.5
1   -5.5
2   -4.5
3   -3.5
4    2.5
5    3.5
6    4.5
7    5.5
8    6.5
9    7.5
Name: B, dtype: float64

Ваш ответ на вопрос