¿Cómo agrupar valores idénticos y contar su frecuencia en Python?


10

Novato a la analítica con Python, así que por favor sea amable :-) No pude encontrar la respuesta a esta pregunta, disculpas si ya está respondida en otro lugar en un formato diferente.

Tengo un conjunto de datos de transacciones para una tienda minorista. Las variables junto con la explicación son:

  • sección: la sección de la tienda, un str;
  • prod_name: nombre del producto, un str;
  • recibo: el número de la factura, un int;
  • cajero, el número del cajero, un int;
  • costo: el costo del artículo, un flotador;
  • fecha, en formato MM / DD / AA, un str;
  • tiempo, en formato HH: MM: SS, un str;

El recibo tiene el mismo valor para todos los productos comprados en una sola transacción, por lo tanto, puede usarse para determinar el número promedio de compras realizadas en una sola transacción.

¿Cuál es la mejor manera de hacer esto? Esencialmente quiero usar groupby()para agrupar la variable de recibo por sus propias ocurrencias idénticas para que pueda crear un histograma.

Trabajando con los datos en un pandas DataFrame.

EDITAR:

Aquí hay algunos datos de muestra con encabezado (prod_name es en realidad un número hexadecimal):

 section,prod_name,receipt,cashier,cost,date,time 
 electronics,b46f23e7,102856,5,70.50,05/20/15,9:08:20 
 womenswear,74558d0d,102857,8,20.00,05/20/15,9:12:46 
 womenswear,031f36b7,102857,8,30.00,05/20/15,9:12:47 
 menswear,1d52cd9d,102858,3,65.00,05/20/15,9:08:20 

De este conjunto de muestra, esperaría un histograma de recibo que muestre dos ocurrencias del recibo 102857 (ya que esa persona compró dos artículos en una transacción) y una ocurrencia respectivamente del recibo 102856 y del recibo 102858. Nota: mi conjunto de datos no es enorme, aproximadamente 1 millón de filas


Hecho, se agregaron algunos datos de muestra.
new_analyst

Respuestas:


15

De este conjunto de muestras, esperaría un histograma de recibo que muestre dos ocurrencias del recibo 102857 (ya que esa persona compró dos artículos en una transacción) y una ocurrencia respectivamente del recibo 102856 y del recibo 102858.

Entonces quieres:

df.groupby ('recibo'). ticket.count ()

receipt
102856    1
102857    2
102858    1
Name: receipt, dtype: int64

dado que el resultado ya no es un marco de datos, ¿cómo filtramos esto para mostrar solo los valores que tienen un recuento de más de 1?
Nikhil VJ

1
Todavía puedes hacer cosas como s[s>1], dondes=df.groupby('receipt').receipt.count()
Emre

2

Estoy preparando algunos tutoriales sobre la disputa de datos. Tal vez mi cuaderno jupyter en github ayude. Creo que es la clave está modificando la línea:

df.groupby('male')['age'].mean()

ser - estar:

df.groupby('reciept')['prod_name'].count()

Para agrupar por múltiples variables esto debería funcionar:

df.groupby(['reciept','date'])['reciept'].count()

Gracias por eso. Sin embargo, a veces el recibo se repite (cuando la fecha también es diferente). Por lo tanto, estamos agregando todas las diferentes ocurrencias de recepción incluso en diferentes fechas, cuando realmente queremos saber el número de recepción por transacción; sin embargo, no existe una variable de ID de transacción única. No creo que el recibo se repita el mismo día, ¿podemos usar la fecha como una forma de grupo? df.groupby('reciept')['date'].count()da el mismo resultado quedf.groupby('reciept')['prod_name'].count()
new_analyst

Agregue la fecha como un parámetro dentro de la llamada groupby. Edité mi respuesta anterior para agrupar por varios vars.
Ryan

0

Por lo que puedo entender es que necesitaría un histograma de su recibo no. Puedes probar algo como esto

import pandas as pd data = np.read_csv("your_file_path.csv") data.groupby(["receipt"])receipt.count().sort_values(ascending=False).head(20).plot.bar()

Esto le proporcionará gráficos de barras de la mayoría de los números de facturación repetidos (20 más repetidos) Cambie el número en la función de encabezado para obtener más o menos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.