Частота счета pivot pandas pivot_table в одном столбце

Я по-прежнему новичок в Pivot pandas pivot_table и хотел бы спросить способ подсчета частот значений в одном столбце, который также связан с другим столбцом идентификатора. DataFrame выглядит следующим образом.

import pandas as pd
df = pd.DataFrame({'Account_number':[1,1,2,2,2,3,3],
                   'Product':['A', 'A', 'A', 'B', 'B','A', 'B']
                  })

Для вывода я хотел бы получить следующее:

                Product
                A      B
Account_number           
      1         2      0
      2         1      2
      3         1      1

До сих пор я пробовал этот код:

df.pivot_table(rows = 'Account_number', cols= 'Product', aggfunc='count')

Этот код дает мне две вещи. В чем проблемы с кодом выше? Одной из причин, почему я задаю этот вопрос, является то, что этот DataFrame является просто примером. Реальные данные, над которыми я работаю, имеют десятки тысяч учетных записей. Заранее спасибо за помощь!

Ответ 1

Вам нужно указать aggfunc как len:

In [11]: df.pivot_table(index='Account_number', columns='Product', 
                        aggfunc=len, fill_value=0)
Out[11]:
Product         A  B
Account_number
1               2  0
2               1  2
3               1  1

Он выглядит как count, подсчитывает экземпляры каждого столбца (Account_number и Product), мне не ясно, является ли это ошибкой...

Ответ 2

В новой версии Pandas требуется небольшая модификация. Я должен был потратить некоторое время на выяснение, поэтому просто хотел добавить это здесь, чтобы кто-то мог напрямую использовать это.

df.pivot_table(index='Account_number', columns='Product', aggfunc=len,
               fill_value=0)

Ответ 3

Решение: Используйте aggfunc='size'

Использование aggfunc=len или aggfunc='count' как и все другие ответы на этой странице, не будет работать для DataFrames с более чем тремя столбцами. По умолчанию pandas будет применять этот aggfunc ко всем столбцам, не найденным в параметрах index или columns.

Например, если бы в нашем исходном DataFrame было еще два столбца:

df = pd.DataFrame({'Account_number':[1, 1, 2 ,2 ,2 ,3 ,3], 
                   'Product':['A', 'A', 'A', 'B', 'B','A', 'B'], 
                   'Price': [10] * 7,
                   'Quantity': [100] * 7})

Выход:

   Account_number Product  Price  Quantity
0               1       A     10       100
1               1       A     10       100
2               2       A     10       100
3               2       B     10       100
4               2       B     10       100
5               3       A     10       100
6               3       B     10       100

Если вы примените текущие решения к этому DataFrame, вы получите следующее:

df.pivot_table(index='Account_number',
               columns='Product',
               aggfunc=len,
               fill_value=0)

Выход:

                  Price    Quantity   
Product            A  B        A  B
Account_number                     
1                  2  0        2  0
2                  1  2        1  2
3                  1  1        1  1

Решение

Вместо этого используйте aggfunc='size'. Поскольку size всегда возвращает одинаковый номер для каждого столбца, pandas не вызывает его на каждом отдельном столбце и просто делает это один раз.

df.pivot_table(index='Account_number', 
               columns='Product',
               aggfunc='size',
               fill_value=0)

Выход:

Product         A  B
Account_number      
1               2  0
2               1  2
3               1  1

Ответ 4

Вы можете использовать count df.pivot_table(index='Account_number', columns='Product', aggfunc='count')