Transform и лямбда со списками ведут себя по-разному, что трансформируется с помощью кортежей или dict. Это ожидается? Почему? - PullRequest
0 голосов
/ 27 марта 2020

При попытке применить 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

...