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.

groupby_dynamic con un índice diseñado por uno mismo

Cómo hacer algo parecido a groupby_dynamic pero que pueda admitir un índice definido por el usuario.

El groupby_dynamic puede admitir un índice de tiempo para realizar una operación como un remuestreo.

Pero solo puede admitir el rango de manera no duplicada, como por ejemplo:


time
day1 9:00
day1 15:00
day2 9:00
day2 15:00
day3 9:00
day3 15:00

groupby dinámico a 1D

day1  9:00

<h2>day1 15:00</h2>

day2  9:00

<h2>day2  15:00</h2>

day3  9:00
day3 15:00

La característica que solicito es una forma más definida por el usuario de agrupar dinámicamente y el índice puede estar duplicado.

day1  9:00
day1 15:00

day2  9:00

<h2>day2  15:00</h2>

day2  9:00
day2  15:00
day3  9:00

<h2>day3 15:00</h2>

Puedo usar rolling en una serie, pero rolling_apply desperdicia mucho tiempo ya que hace rodar cada índice.

day1  9:00
day1 15:00

day2  9:00

<h2>day2  15:00</h2>

day1 15:00
day2  9:00
day2  15:00
day3  9:00
--------------  -------> esta ventana no sirve
day2  9:00
day2  15:00
day3  9:00

<h2>day3  15:00</h2>

day2  15:00
day3  9:00
day3  15:00
day4  9:00
------------  -------> esta ventana no sirve

imagen de ejemplo

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para crear un groupby dinámico que admita un índice definido por el usuario, podemos modificar la función groupby_dynamic actual para recibir un parámetro para el índice. Esto nos permitirá agrupar los datos según el índice definido por el usuario, incluso si está duplicado.

    Una posible implementación podría ser:

    def groupby_dynamic(df, index_col):
        df.sort_values(by=index_col, inplace=True)
        groups = []
        start = 0
        for i in range(1, len(df)):
            if df[index_col].iloc[i] != df[index_col].iloc[i-1]:
                groups.append((start, i))
                start = i
        groups.append((start, len(df)))
        return [df.iloc[s:e] for s, e in groups]
    

    Aquí, primero ordenamos el dataframe según la columna de índice definida por el usuario. Luego, recorremos las filas y verificamos si el valor del índice cambia con respecto a la fila anterior. Si lo hace, guardamos los índices de inicio y fin del grupo anterior y comenzamos uno nuevo. Finalmente, devolvemos una lista de dataframes, cada uno conteniendo las filas para un grupo específico.

    Esta implementación debería ser capaz de manejar valores de índice definidos por el usuario, incluso si están duplicados, y agruparlos adecuadamente.

Comments are closed.