Autor Tema: Sucesión numérica por agrupación en pandas

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

15 Enero, 2022, 12:52 am
Leído 655 veces

MeFon

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 15
  • País: co
  • Karma: +0/-0
Hola a todos
Espero puedan colaborarme con esta pregunta
Tengo el siguiente código
Código: [Seleccionar]
import xlrd, openpyxl
import numpy as np
import pandas as pd
df= pd.DataFrame(np.array([["television","5895"],["equipo de sonido","5895"], ["teatro en casa", "5895"],\
                            ["lavadora","6854"], ["estufa","6854"], ["horno","6854"], ["horno microondas","6854"],["neveras","6854"]]),
                   columns=['Electrodoméstico', 'Sección'])
Es decir esto:

Cada electrodoméstico tiene un número de sección según el área al que pertenezca, en este caso los electrodomésticos de entretenimiento, tienen el código 5895, los de cocina tienen el 6854.
Quiero generar una columna que me de el conteo consecutivo de cada sección por electrodoméstico, es decir que devuelva lo siguiente:


Gracias

15 Enero, 2022, 02:58 am
Respuesta #1

ingmarov

  • Moderador Global
  • Mensajes: 5,320
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola MeFon

¿Qué has intentado? ¿Qué idea tienes?

Si sigues buscando respuestas para copiar nunca vas a aprender a resolver por ti mismo.

Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

15 Enero, 2022, 04:15 am
Respuesta #2

MeFon

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 15
  • País: co
  • Karma: +0/-0
Hola, la verdad intenté con varias cosas, incluyendo groupby, sin embargo, no me familiarizo mucho con esta función aún.
Opté por hacer una iteración pero sin resultado
Código: [Seleccionar]
num=df1["Sección"]
nuevo=[]
for i in range(len(num)):
    nuevo.append(np.arange(1,len(num))
df1["nuevo"]=nuevo
df1
No lo coloqué porque no aporta mucho a lo que necesito

15 Enero, 2022, 05:24 am
Respuesta #3

ingmarov

  • Moderador Global
  • Mensajes: 5,320
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
He añadido texto, me hizo falta después de escribir una idea y luego cambiarla por otra.

...
No lo coloqué porque no aporta mucho a lo que necesito

No importa si no aporta, al menos miramos qué has intentado.

No sé si hay una función que lo haga de forma directa, pero te escribo algunas ideas.

1. Necesitas un diccionario para almacenar los casos distintos presentes columna "Sección". En este caso particular solo tienes dos elementos en este diccionario, pero podrías recorrer todos los elementos de dicha columna, sacar los casos distintos y almacenarlos  en dicho diccionario. La clave del diccionario será el caso y el valor será la cantidad acumulada.

2. Luego podrías crear la columna "Número" Freq con valor inicial cero.

3. Finalmente recorres la columna revisando los casos contenidos o no en las claves del diccionario y vas sumando los valores correspondientes.

Te pongo este ciclo for para que lo revises, lo estudies y si puedes mejorarlo nos compartes tu solución.

Código: [Seleccionar]
for i in range(len(df1)):
if df1["Sección"].iloc[i] in casos.keys():
casos[df1["Sección"].iloc[i]]=casos[df1["Sección"].iloc[i]]+1

else:
casos[df1["Sección"].iloc[i]]=1
df1["Freq"].iloc[i]=casos[df1["Sección"].iloc[i]]

Intenta ver cómo funciona este ciclo. Creo que funciona, lo he probado.


Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

16 Enero, 2022, 04:51 pm
Respuesta #4

MeFon

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 15
  • País: co
  • Karma: +0/-0
Hola
Gracias por tu respuesta, quería preguntarte que hace .keys() en este caso, qué me devuelve y a qué se aplica, a dataframe o a listas o a los dos se puede.
Coloqué antes del código
casos=[]
Pero no sé si es que debo colocar casos cómo la unión de las dos columnas que me dan.


16 Enero, 2022, 05:31 pm
Respuesta #5

ingmarov

  • Moderador Global
  • Mensajes: 5,320
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Hola
Gracias por tu respuesta, quería preguntarte que hace .keys() en este caso, qué me devuelve y a qué se aplica, a dataframe o a listas o a los dos se puede.
Coloqué antes del código
casos=[]
Pero no sé si es que debo colocar casos cómo la unión de las dos columnas que me dan.


Es un diccionario

Si a es un diccionario a={key1:value1, key2:value2}

Entonces a.keys() devuelve la lista [key1, key2]


Además   a[key1]  devuelve value1

Saludos

No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

19 Enero, 2022, 02:48 pm
Respuesta #6

MeFon

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 15
  • País: co
  • Karma: +0/-0
Muchas gracias, no entendía cómo funcionaban los diccionarios, pero ya es más claro, convertí el dataframe que tenía en un diccionario con .todict() cree una columna que se llamara "Freq" como me dijiste y corrió sin problemas, estoy tratando de ver si hay una manera de reducir el código, cualquier cosa lo posteará.
Saludos

19 Enero, 2022, 02:59 pm
Respuesta #7

ingmarov

  • Moderador Global
  • Mensajes: 5,320
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
Muchas gracias, no entendía cómo funcionaban los diccionarios, pero ya es más claro, convertí el dataframe que tenía en un diccionario con .todict() cree una columna que se llamara "Freq" como me dijiste y corrió sin problemas, estoy tratando de ver si hay una manera de reducir el código, cualquier cosa lo posteará.
Saludos

Bien.

Te ayudo, "casos" es un diccionario y lo puedes crear haciendo simplemente: >> casos={}
Lo que crea un diccionario vacío. El ciclo for se encargará de añadir los casos y su frecuencia.

Debes crear la columna "Freq" (o como le quieras llamar) en tu dataframe (df), inicializa esta columna como una columna de ceros. Lo puedes hacer así. >>df["Freq"]=[0]*len(df).    El ciclo for modifica estos valores y asigna el valor correcto leyéndolo desde el diccionario creado.

Has las modificaciones necesarias en el ciclo for y corre el programa.

Añado

No es necesario convertir el DataFrame en diccionario.
¿Para qué quieres reducir el código? Quizás tendrías que buscar otra forma de resolver el problema.



Saludos
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...