При попытке применить pandas transform
для возврата нескольких значений (цель состоит в том, чтобы эмулировать агрегацию нескольких оконных функций в данной группе), я заметил, что при использовании конструкции списка результаты отличаются от ожидаемых.
В частности, вместо того, чтобы возвращать для каждой строки сумму, стандартное отклонение и среднее значение, он разбивает результат по вертикали.
Если для обобщения агрегатов используется словарь или кортежи , он не разбивает результаты по вертикали и для каждой строки отображает сумму, стандартное отклонение и среднее значение (требуемый результат).
Ниже приведен пример поведения, описанного выше.
Почему поведение со списком отличается от поведения с кортежами и словарями?
import pandas as pd
import numpy as np
df = pd.DataFrame({"id": [1, 1, 1], "amount": [387885, 302749, 293763]})
# Line below returns 3 rows (one containing the sum, the second the standard deviation, and 3rd the average
df.groupby("id")[["amount"]].transform(lambda x: [x.sum(), np.std(x), np.mean(x)])
# The line below returns (984397, 42410.47770958912, 328132.3333333333) on each row
df.groupby("id")[["amount"]].transform(lambda x: (x.sum(), np.std(x), np.mean(x)))
# The line below return on {"sum": 984397, "std": 42410.47770958912, "avg": 328132.3333333333} on each row
df.groupby("id")[["amount"]].transform(lambda x: {"sum": x.sum(), "std": np.std(x), "avg": np.mean(x)})
Версии, используемые для репликации результатов: Python 3.7.3 Pandas 1.0.3 и Numpy 1.16.2