Iteradores de pitón y grupo Pandas : punto de partida

Tengo un marco de datos pandas. Los he agrupado basado en una cierta columna. La forma del marco de datos es (1275553, 87)

He creado entonces un iterador, que me permite iterar a través de cada grupo para crear una animación. Me gustaría poder especificar el punto de partida para el iterador, como usaría pandas.core.groupby.GroupBy.get_group. En la actualidad, me veo obligado a iterar a través de los diversos grupos hasta que haya alcanzado mi punto de partida deseado, que no parece muy eficiente:

counter_group = df.groupby('counterValue')
temp=iter(counter_group)
while count != 20302:
   count, frame = next(temp)
#do something with frame

Estaba jugando con iterator.send() Aunque no puedo averiguar cómo usarlo en GroupBy. Agradecería mucho cualquier ayuda. Si la pregunta requiere algún aporte de muestra, actualizaré si se solicita.

Estoy usando pitón 3.7.7, y pandas 1.0.4

Pregunta hecha hace 3 años, 5 meses, 0 días - Por techtactician


2 Respuestas:

  • Para especificar un punto de partida en un iterador de un objeto GroupBy en pandas, puedes utilizar la función itertools.dropwhile para descartar los elementos del iterador hasta llegar al punto de partida deseado. Aquí te muestro un ejemplo de cómo podrías hacerlo:

    python
    import pandas as pd
    from itertools import dropwhile
    
    

    Crear un DataFrame de ejemplo

    data = {'counterValue': [1,1,2,2,3,3], 'col2': ['A','B','C','D','E','F']} df = pd.DataFrame(data)

    Agrupar por 'counterValue'

    counter_group = df.groupby('counterValue')

    Definir la función para el punto de partida deseado

    def start_point(x): return x == 2

    Especifica aquí el punto de partida deseado

    Crear el iterador y omitir elementos hasta llegar al punto de partida

    temp = iter(counter_group) temp = dropwhile(lambda x: not start_point(x[0]), temp)

    Iterar sobre los elementos a partir del punto de partida

    for count, frame in temp: print(frame)

    Realiza las operaciones deseadas con frame

    En este ejemplo, la función start_point se utiliza para definir el punto de partida deseado (en este caso, cuando el valor de la columna 'counterValue' sea igual a 2). Luego, la función dropwhile se utiliza para descartar los elementos del iterador hasta llegar al punto de partida especificado.

    Espero que esta solución te sea útil. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 17, 2020 a las 20:56 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para especificar un punto de partida para un iterador de agrupación de Pandas, puedes utilizar el método get_group(). Este método devuelve un subconjunto del marco de datos original que contiene solo las filas del grupo especificado.

    Aquí tienes cómo puedes utilizar get_group() para establecer un punto de partida para tu iterador:

    python
    import pandas as pd
    
    

    Crea un marco de datos de ejemplo

    df = pd.DataFrame({'counterValue': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'value': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]})

    Agrupa el marco de datos por la columna 'counterValue'

    counter_group = df.groupby('counterValue')

    Establece el punto de partida en el grupo con 'counterValue' igual a 3

    starting_group = counter_group.get_group(3)

    Crea un iterador a partir del grupo inicial

    iterator = iter(starting_group)

    Itera a través del resto de los grupos

    for group_name, group_data in iterator:

    Haz algo con el grupo actual

    print(group_name, group_data)

    En este ejemplo, el punto de partida se establece en el grupo donde counterValue es igual a 3. El iterador comenzará desde este grupo y continuará iterando a través de los grupos restantes en el orden ascendente de counterValue.

    Ten en cuenta que el método get_group() devuelve un subconjunto del marco de datos original, no un iterador. Para iterar a través de los grupos, debes crear un iterador a partir del subconjunto devuelto.

    Respondida el Dec 17, 2020 a las 21:00 - por Gemini

    Votos positivos: 0 | Votos negativos: 0