python pandas numpy group-by

python - Agrupar por números de índice consecutivos



pandas numpy (6)

Me preguntaba si hay una manera de agrupar por números de índice consecutivos y mover los grupos en diferentes columnas. Aquí hay un ejemplo del DataFrame que estoy usando:

0 0 19218.965703 1 19247.621650 2 19232.651322 9 19279.216956 10 19330.087371 11 19304.316973

Y mi idea es agrupar por números de índice secuenciales y obtener algo como esto:

0 1 0 19218.965703 19279.216956 1 19247.621650 19330.087371 2 19232.651322 19304.316973

He estado tratando de dividir mis datos en bloques de 3 y luego agruparlos, pero estaba buscando más sobre algo que pueda usarse para agrupar y reorganizar números de índice secuenciales. ¡Gracias!


Crear nuevos pandas.Series con nuevos pandas.MultiIndex

a = pd.factorize(df.index - np.arange(len(df)))[0] b = df.groupby(a).cumcount() pd.Series(df[''0''].to_numpy(), [b, a]).unstack() 0 1 0 19218.965703 19279.216956 1 19247.621650 19330.087371 2 19232.651322 19304.316973

Similar pero con más Numpy

a = pd.factorize(df.index - np.arange(len(df)))[0] b = df.groupby(a).cumcount() c = np.empty((b.max() + 1, a.max() + 1), float) c.fill(np.nan) c[b, a] = np.ravel(df) pd.DataFrame(c) 0 1 0 19218.965703 19279.216956 1 19247.621650 19330.087371 2 19232.651322 19304.316973


Aquí hay una manera:

from more_itertools import consecutive_groups final=pd.concat([df.loc[i].reset_index(drop=True) for i in consecutive_groups(df.index)],axis=1) final.columns=range(len(final.columns)) print(final)

0 1 0 19218.965703 19279.216956 1 19247.621650 19330.087371 2 19232.651322 19304.316973


Creo que ha asumido que el número de observaciones dentro de cada grupo consecutivo será el mismo. Mi enfoque es:

Prepara los datos:

import pandas as pd import numpy as np df = pd.DataFrame(data ={''data'':[19218.965703 ,19247.621650 ,19232.651322 ,19279.216956 ,19330.087371 ,19304.316973]}, index = [0,1,2,9,10,11] )

Y la solucion:

df[''Group''] = (df.index.to_series()-np.arange(df.shape[0])).rank(method=''dense'') df.reset_index(inplace=True) df[''Observations''] = df.groupby([''Group''])[''index''].rank() df.pivot(index=''Observations'',columns=''Group'', values=''data'')

Que devuelve:

Group 1.0 2.0 Observations 1.0 19218.965703 19279.216956 2.0 19247.621650 19330.087371 3.0 19232.651322 19304.316973


Esta es una groupby + pivot_table

m = df.index.to_series().diff().ne(1).cumsum() (df.assign(key=df.groupby(m).cumcount()) .pivot_table(index=''key'', columns=m, values=0))

1 2 key 0 19218.965703 19279.216956 1 19247.621650 19330.087371 2 19232.651322 19304.316973


Mi manera:

df[''groups'']=list(df.reset_index()[''index'']-range(0,len(df))) pd.concat([df[df[''groups'']==i][[''0'']].reset_index(drop=True) for i in df[''groups''].unique()],axis=1) 0 0 0 19218.965703 19279.216956 1 19247.621650 19330.087371 2 19232.651322 19304.316973


Una forma de pandas groupby

s=df.index.to_series().diff().ne(1).cumsum() pd.concat({x: y.reset_index(drop=True) for x, y in df[''0''].groupby(s)}, axis=1) Out[786]: 1 2 0 19218.965703 19279.216956 1 19247.621650 19330.087371 2 19232.651322 19304.316973