Tengo un marco de datos que se ve así:
time count class flag
t1 876 10 1
t2 900 10 1
t3 910 10 1
t4 934 10 1
t5 871 10 1
t6 880 14 2
t7 800 14 2
t8 812 14 2
t9 877 14 2
t10 865 14 2
Quiero crear un conjunto de marcos de datos que se vean así:
DF1
time count class
t3 910 10
t4 934 10
t5 871 10
DF2
time count class
t2 900 10
t3 910 10
t4 934 10
DF3
time count class
t1 876 10
t2 900 10
t3 910 10
DF4
time count class
t8 812 14
t9 877 14
t10 865 14
y así. La cantidad de filas en cada marco de datos se puede cambiar, por lo que probablemente una función que tome el marco de datos original y un número y me proporcione un conjunto de marcos de datos, cada uno con filas = número. La agrupación se realiza en base a banderas. y necesito empezar a crear desde abajo. entonces, para cada bandera, como se muestra aquí, el marco de datos comienza a crearse desde abajo.
Solución del problema
Puede usar windowed
la función de more_itertools
para crear una lista de la ventana móvil, por ejemplo:
> list(more_itertools.windowed(range(5), n=3))
[(0, 1, 2), (1, 2, 3), (2, 3, 4)]
Aplique esta función al grupo de pandas:
dfs = (df.groupby('flag')
.apply(lambda group: list(map(lambda ids: group.iloc[list(reversed(ids))],
more_itertools.windowed(reversed(range(len(group))), n=3))))
.tolist())
Luego use la flatten
función de more_itertools
para aplanar la lista de lista
dfs = list(more_itertools.flatten(dfs))
[ time count class flag
2 t3 910 10 1
3 t4 934 10 1
4 t5 871 10 1, time count class flag
1 t2 900 10 1
2 t3 910 10 1
3 t4 934 10 1, time count class flag
0 t1 876 10 1
1 t2 900 10 1
2 t3 910 10 1, time count class flag
7 t8 812 14 2
8 t9 877 14 2
9 t10 865 14 2, time count class flag
6 t7 800 14 2
7 t8 812 14 2
8 t9 877 14 2, time count class flag
5 t6 880 14 2
6 t7 800 14 2
7 t8 812 14 2]
No hay comentarios.:
Publicar un comentario