Divida el marco de datos de pandas en función de los valores en una columna usando groupby

2 minutos de lectura

avatar de usuario de user308827
usuario308827

Quiero dividir el siguiente marco de datos basado en la columna ZZ

df = 
        N0_YLDF  ZZ        MAT
    0  6.286333   2  11.669069
    1  6.317000   6  11.669069
    2  6.324889   6  11.516454
    3  6.320667   5  11.516454
    4  6.325556   5  11.516454
    5  6.359000   6  11.516454
    6  6.359000   6  11.516454
    7  6.361111   7  11.516454
    8  6.360778   7  11.516454
    9  6.361111   6  11.516454

Como salida, quiero una nueva DataFrame con el N0_YLDF columna dividida en 4, una nueva columna para cada valor único de ZZ. ¿Cómo hago esto? Puedo hacer groupby, pero no sé qué hacer con el objeto agrupado.

gb = df.groupby('ZZ')    
[gb.get_group(x) for x in gb.groups]

  • ¡Gran respuesta! ¿Cómo extraemos los marcos de datos respectivos de gb?

    – máximo

    26 de abril de 2022 a las 15:43

  • El método get_group(x) devuelve un nuevo objeto DataFrame que contiene solo las filas donde la columna ZZ == X

    – qwwqwwq

    9 de mayo de 2022 a las 12:42

Avatar de usuario de Anton vBR
Antón vBR

Hay otra alternativa, ya que groupby devuelve un generador, simplemente podemos usar una lista de comprensión para recuperar el segundo valor (el marco).

dfs = [x for _, x in df.groupby('ZZ')]

  • ¿Funcionaría este trazador de líneas si busco hacer agregaciones específicas para cada marco de datos?

    – Enchufe de datos

    16 de marzo de 2022 a las 23:03

  • Este one-liner simplemente almacena los marcos de datos en una matriz. Lo que hagas a continuación depende de ti. Tal vez eche un vistazo a la respuesta de ALollz para acceder a las claves.

    – Anton vBR

    17 de marzo de 2022 a las 10:25

En R hay un método de marco de datos llamado división. Esto es para todos los usuarios de R:

def split(df, group):
     gb = df.groupby(group)
     return [gb.get_group(x) for x in gb.groups]

  • ¿No deberías ponerlo todo en una serie? terminando con pd.Series(...)

    – Adán

    23 mayo 2017 a las 19:47

  • Esto es increíble. ¿Hay alguna manera fácil de obtener la clave que identifica al grupo, para poder devolver una lista de tuplas, como [ (key, gb.get_group(x) ) for x in gb.group]?

    – rsmith54

    22 de agosto de 2017 a las 19:47


  • Encontré esto, que lo hace fácil: stackoverflow.com/questions/42513049/…

    – rsmith54

    22 de agosto de 2017 a las 19:59

  • Solo para proporcionar una respuesta al comentario (que se explica con más detalle en el enlace: [(key, gb.get_group(key)) for key in gb.groups]

    – de1

    22 de noviembre de 2017 a las 17:24

  • La misma solución pero con iteradores. def split(df, group): gb = df.groupby(group) for g in gb.groups: yield gb.get_group(g)

    – Jonatas Eduardo

    19 oct 2021 a las 14:04


Guárdelos en un dictque le permite acceder al grupo DataFrames en función de las claves del grupo.

d = dict(tuple(df.groupby('ZZ')))
d[6]

#    N0_YLDF  ZZ        MAT
#1  6.317000   6  11.669069
#2  6.324889   6  11.516454
#5  6.359000   6  11.516454
#6  6.359000   6  11.516454
#9  6.361111   6  11.516454

Si solo necesita un subconjunto del DataFrame, en este caso solo el 'NO_YLDF' Serie, puede modificar la comprensión de dict.

d = dict((idx, gp['N0_YLDF']) for idx, gp in df.groupby('ZZ'))
d[6]
#1    6.317000
#2    6.324889
#5    6.359000
#6    6.359000
#9    6.361111
#Name: N0_YLDF, dtype: float64

¿Ha sido útil esta solución?