es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encontrar los mismos valores en una lista (¿o tupla?), agruparlos juntos, y verificar el resto de los elementos.

Tengo un archivo de Excel del cual estoy extrayendo datos. Los datos son básicamente una tabla de un día y personas jugando juntas.

día pl1 pl2
Lun 1000 1011
Mar 1100 0101
Mar 1000 0121
Mié 0101 1101
Lun 0210 1212
Mié 1000 0101

Quiero asegurarme de que ningún identificador juegue más de una vez (independientemente de si está en la columna de pl1 o pl2) en un día.
Por ejemplo, en Mié tenemos “0101” dos veces, una como pl1 y otra en pl2, y quiero detectarlo.

Y estoy buscando cuál es la forma más rápida y más “pythonic”.

1) Se me ocurrió verificar todos los elementos de la lista pl1 y pl2, y si encuentro el mismo valor en cualquier lugar, verificar si el valor en la columna del día es el mismo o no. Sin embargo, no solo creo que esto sería extremadamente lento de procesar, sino que también creo que es más complicado de verificar.

2) La otra idea es moverlos en listas de listas [[Mon,1000,1012],[Tue,1110,0101]…] y agruparlos por día, ¿y luego verificar también el resto de los elementos? Aún parece que llevaría demasiado tiempo.

3) ¿Debería crear una lista de tuplas en su lugar? (Ya uso tuplas y verifico que no haya pares idénticos (mismo identificador y en la misma posición de pl1 y pl2))

¿Existe alguna forma más rápida y compacta?

Gracias

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución, utilizando pandas y groupby, sería reestructurar los datos en un formato largo, donde cada fila representa una combinación única de día, jugador y posición (pl1 o pl2). Luego, podríamos agrupar los datos por día y jugador, y contar el número de posiciones únicas en las que el jugador apareció para cada día. Si este conteo es mayor que 1, significa que el jugador jugó en varias posiciones el mismo día, lo cual podemos marcar y reportar. Aquí hay un código de muestra para ilustrar este enfoque:

    import pandas as pd
    
    # leer los datos del archivo de Excel
    df = pd.read_excel("data.xlsx")
    
    # reformatear los datos en un formato largo
    df_long = pd.melt(df, id_vars="day", value_vars=["pl1", "pl2"], var_name="position", value_name="player")
    
    # agrupar por día y jugador, y contar el número de posiciones únicas
    counts = df_long.groupby(["day", "player"]).position.nunique()
    
    # filtrar los conteos mayores que 1, indicando que el jugador jugó en múltiples posiciones el mismo día
    flagged = counts[counts > 1].reset_index()
    
    # reportar los jugadores marcados
    if len(flagged) > 0:
        print("Los siguientes jugadores jugaron en múltiples posiciones el mismo día:")
        print(flagged)
    else:
        print("Ningún jugador jugó en múltiples posiciones el mismo día.")
    

    Este enfoque debería ser relativamente rápido y compacto, especialmente en comparación con la iteración manual a través de listas o tuplas. También permite una fácil manipulación y análisis de los datos utilizando pandas.

Comments are closed.