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 columnaZZ
== X– qwwqwwq
9 de mayo de 2022 a las 12:42
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 dict
que 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