Autor Tema: Quitar items de un conteo en python

0 Usuarios y 1 Visitante están viendo este tema.

03 Abril, 2022, 04:12 am
Leído 225 veces

MeFon

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 15
  • País: co
  • Karma: +0/-0
Hola a todos
Estoy trabajando con lo siguiente:

En esta tabla podemos ver las variables, mes, id cliente, artículo, y precio neto
Mes 1 es enero, 2 febrero y así sucesivamente.
En principio quiero saber la cantidad de clientes que compran cada mes, para esto hago un conteo usando el Id cliente cómo base, dado que este es único para cada cliente.
Lo hago de la siguiente manera

Código: [Seleccionar]
cuenta['Conteo']=1
cuenta=cuenta.groupby(by=['Mes', 'ID Cliente'],as_index=False).agg({'Conteo':pd.Series.sum})
Código: [Seleccionar]
cuenta['#Clientes/Mes']=1
cant_clientes_mes=cuenta.drop(['Conteo'],axis=1)
cant_clientes_mes=cant_clientes_mes.groupby(by=['Mes']
                               ,as_index=False).agg({'#Clientes/Mes':pd.Series.sum})
Esto produce esto


(Creo que existe una manera más corta de hacerlo, pero me funciona) este #Cliente mes me dice cuántos clientes diferentes compraron en cada mes, sin embargo, quiero integrar que si alguno de los ID ya compró en un mes anterior, no lo cuente sino únicamente en el mes en el que aparece por primera vez, por ejemplo, el id 2122 compró en el mes de enero, pero también en el mes de febrero, quiero que la cuenta sólo aparezca en el mes de enero, de esta manera el mes de febrero sólo tendría dos clientes diferentes.
Algo así, quiero que devuelva:

La verdad no he visto cómo poder hacerlo, pensé en usar un for para meses y un condicional con <=, para el mes así:
Código: [Seleccionar]
for i in mes:
    for j in meses:
        if j<=i:
            cuenta=cuenta[cuenta['Mes']<=i]
            cant_clientes_mes=cuenta['ID Cliente'].unique().shape[0]
    print(cant_clientes_mes)
Pero el resultado es 5, 7, 8
Agradezco su colaboración

03 Abril, 2022, 12:25 pm
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,472
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Oh Oh!!! me contestó... y ahora qué le digo...

Creo que la mejor táctica, no la que crea menos espacio de memoria es, filtrar la tabla original usando un for pasando por todos los registros, usando una tabla extra nueva para almacenar los datos de los clientes nuevos... ej arranca la tabla vacía y cada nuevo registro del for preguntas si el cliente de la primera ya está en la en la segunda tabla si no lo está guardas el registro completo de su primer visita en la segunda , de lo contrario descartas el registro.
Luego con la tabla terminada ejecuta el conteo de clientes agrupando por mes.


De esta manera te devolverá 5,2,1 para los meses 1,2,3 respectivamente que será correcto tal como has arribado , no hay manera que sea 5,7,8  el resultado con esa tabla ya que ni siquiera la tabla completa tiene 8 registros para el mes 3, quizá sea un gazapo del solucionario, no dejas claro sie eso es lo que necesitas , o bien te piden otra cosa como...fíjate que 5,7,8 es el acumulado de clientes totales individuales mes a mes. En el mes uno tienes 5 pero llegan dos nuevos en el dos y 5+2 ya son 7 y en el tercer mes se agrego 1 llegando a 8,  por lo que los clientes individuales acumulados mes a mes es 5,7,8 probablemente te estén pidiendo eso .


Puedes calcular el acumulado contando los individuos  mientras el mes es menor o igual a que necesites.




saludos
Saludos  \(\mathbb {R}^3\)

05 Abril, 2022, 11:37 pm
Respuesta #2

MeFon

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 15
  • País: co
  • Karma: +0/-0
Hola la verdad es que aquí he puesto pocos datos pero a la hora de llevarlo a cabo son demasiados y no me es muy óptimo el ir almacenando, y la idea es quitar los que ya se hayan contado en un mes anterior

06 Abril, 2022, 12:51 am
Respuesta #3

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,472
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Oh Oh!!! me contestó... y ahora qué le digo...
Cómo sería exacta la sentencia no lo tengo claro pero lo que tienes que hacer es agrupar por cliente y escoger el mínimo de todos los meses de cada  grupo.
Saludos  \(\mathbb {R}^3\)