Python Pandas pivot_table cuenta frecuencia en una columna

Todavía soy nuevo en pivot_table de los pandas de Python y me gustaría preguntar una forma de contar las frecuencias de los valores en una columna, que también está vinculada a otra columna de ID. El DataFrame se parece a lo siguiente.

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

Para la salida, me gustaría obtener algo como lo siguiente:

  Product AB Account_number 1 2 0 2 1 2 3 1 1 

Hasta ahora, he intentado este código:

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

Este código me da las dos mismas cosas. ¿Cuáles son los problemas con el código anterior? Una parte de la razón por la que me hago esta pregunta es que este DataFrame es solo un ejemplo. Los datos reales en los que estoy trabajando tienen decenas de miles de números de cuenta. Gracias por su ayuda por adelantado!

Necesitas especificar el aggfunc como len :

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

Parece que cuenta, está contando las instancias de cada columna ( Account_number y Product ), no me queda claro si esto es un error …

En la nueva versión de Pandas, se requiere una ligera modificación. Tuve que dedicar un tiempo a entenderlo, así que solo quería agregarlo aquí para que alguien pueda usarlo directamente.

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

Solución: Use aggfunc='size'

Usar aggfunc=len o aggfunc='count' como todas las demás respuestas en esta página no funcionará para DataFrames con más de tres columnas. De forma predeterminada, los pandas aplicarán esta función aggfunc a todas las columnas que no se encuentran en los parámetros de los index o columns .

Por ejemplo, si tuviéramos dos columnas más en nuestro DataFrame original definido de esta manera:

 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}) 

Salida:

  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 

Si aplica las soluciones actuales a este DataFrame, obtendría lo siguiente:

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

Salida:

  Price Quantity Product ABAB Account_number 1 2 0 2 0 2 1 2 1 2 3 1 1 1 1 

Solución

En su lugar, utilice aggfunc='size' . Dado que el size siempre devuelve el mismo número para cada columna, los pandas no lo llaman en cada columna y solo lo hacen una vez.

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

Salida:

 Product AB Account_number 1 2 0 2 1 2 3 1 1 

Puede usar el count df.pivot_table(index='Account_number', columns='Product', aggfunc='count')