Частота счета 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')