Вложенный словарь Python groupby неоднозначен при агрегировании

#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. она прерывается с той же ошибкой «вложенный словарь неоднозначен при агрегировании» (pandas 0.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