#python #pandas #&roup-by #a&&re&ation
#python #pandas #группировка по #агрегация
Вопрос:
В настоящее время я работаю над своей диссертацией и сталкиваюсь с некоторыми проблемами в функции &roupby, которую я хочу выполнить. Я пытаюсь узнать чью-то общую сумму покупки, среднюю сумму покупки, количество покупок, сколько продуктов было куплено в общей сложности и среднюю стоимость каждого продукта.
Данные выглядят следующим образом:
id purchase_amount price_products #_products
0 123 30 20.00 2
2 123 NaN 10.00 NaN
3 124 50.00 25.00 3
4 124 NaN 15.00 NaN
5 124 NaN 10.00 NaN
Мой код выглядит следующим образом:
df.&roupby('id')[['purchase_amount','price_products','#_products']].a&&(total_purchase_amount=('purchase_amount','sum'),avera&e_purchase_amount=('purchase_amount','mean'),times_purchased=('#_products','count'),total_amount_products_purchased=('price_products','count'),avera&e_value_products=('price_products','mean'))
Но я получаю следующую ошибку:
Ошибка спецификации: вложенный словарь неоднозначен при агрегировании
Кажется, я не могу найти, что я делаю неправильно, надеюсь, кто-нибудь сможет мне помочь!
Комментарии:
1. У меня все в порядке с работой
pandas==1.0.0
, какую версию pandas вы используете?2. Спасибо за попытку. Моя версия pandas 0.25.1
3. для меня в версии
'0.25.1'
работает нормально4. Эта же ошибка произошла со мной при запуске, например,
df.&roupby('id')[vars].a&&({'n': "count", 'mean': "mean"})
всякий раз, когдаvars
есть список имен переменных, содержащий только ОДИН элемент. То есть, когдаvars
это список с НЕСКОЛЬКИМИ элементами, агрегация работает нормально, o.w. она прерывается с той же ошибкой «вложенный словарь неоднозначен при агрегировании» (pandas0.22.0
). Обратите внимание, что текущая последняя версия pandas — 1.2.4, где приведенный выше синтаксис больше не принимается. Вместо этого используйтеdf.&roupby('id')[vars].a&&(["count", "mean"])
, и все работает нормально, даже когдаvars
есть один элемент (также верно для0.22.0
).
Ответ №1:
Делайте так для всех вычислений
df.&roupby('id')['purchase_amount'].a&&({'total_purchase_amount':'sum'})
Ответ №2:
Поскольку у вас есть несколько переменных для агрегирования, я бы предложил использовать следующую форму агрегирования:
df.&roupby('id')[<variables-list&&t;].a&&([<statistics-list&&t;])
Например:
df_a&& = df.&roupby('id')[['purchase_amount','price_products','#_products']].a&&(["count", "mean", "sum"])
Это создаст многоуровневый фрейм выходных данных по столбцам df_a&&
, который выглядит как:
purchase_amount price_products #_products
count mean sum count mean sum count mean sum
id
123 1 30.0 30.0 2 15 30 1 2.0 2.0
124 1 50.0 50.0 3 17 51 1 3.0 3.0
Затем вы можете ссылаться на конкретную запись во фрейме выходных данных, используя мультииндекс следующим образом:
df_a&&['purchase_amount']['mean']
id
123 30.0
124 50.0
Name: mean, dtype: float64
или, если вам нужны, например, все средства, используйте метод поперечного сечения xs()
:
df_a&&.xs('mean', axis=1, level=1)
purchase_amount price_products #_products
id
123 30.0 15 2.0
124 50.0 17 3.0
Примечание: предположительно, приведенный выше фрагмент кода заставит Python вычислять больше статистики, чем необходимо, как в вашем примере. Но в определенных контекстах это может и не быть проблемой, и его преимущество в том, что код короче и обобщаем для любого набора и количества (числовых и плавающих) переменных для агрегирования.
Ответ №3:
Вы можете сделать это организованным образом, используя словарь для вашей агрегации.
df = pd.DataFrame([[123, 30, 20, 2],
[123, np.nan, 10, np.nan],
[124, 50, 25, 3],
[124, np.nan, 15, np.nan],
[124, np.nan, 10, np.nan]],
columns=['id', 'purchase_amount', 'price_products', 'num_products']
)
a&&_dict = {
'purchase_amount': [np.sum, np.mean],
'num_products': [np.count_nonzero],
'price_products': [np.count_nonzero, np.mean],
}
print(df.&roupby('id').a&&(a&&_dict))
вывод:
purchase_amount num_products price_products
sum mean count_nonzero count_nonzero mean
id
123 30.0 30.0 2.0 2 15.000000
124 50.0 50.0 3.0 3 16.666667