multiindex index groupby droplevel python pandas

python - groupby - Índice de reinicio de pandas en series para eliminar multiindex



pandas reset index (2)

DataFrame una Series partir de un DataFrame , cuando remuestreé algunos datos con un conteo como ese: donde H2 es un DataFrame :

H3=H2[[''SOLD_PRICE'']] H5=H3.resample(''Q'',how=''count'') H6=pd.rolling_mean(H5,4)

Esto produjo una serie que se ve así:

1999-03-31 SOLD_PRICE NaN 1999-06-30 SOLD_PRICE NaN 1999-09-30 SOLD_PRICE NaN 1999-12-31 SOLD_PRICE 3.00 2000-03-31 SOLD_PRICE 3.00

con un índice que se ve así:

MultiIndex [(1999-03-31 00:00:00, u''SOLD_PRICE''), (1999-06-30 00:00:00, u''SOLD_PRICE''), (1999-09-30 00:00:00, u''SOLD_PRICE''), (1999-12-31 00:00:00, u''SOLD_PRICE''),.....

No quiero la segunda columna como índice. Idealmente, tendría un DataFrame con la columna 1 como "Fecha" y la columna 2 como "Ventas" (bajando el segundo nivel del índice). No veo cómo reconfigurar el índice.


Cuando usa corchetes dobles, como

H3 = H2[[''SOLD_PRICE'']]

H3 se convierte en un DataFrame. Si usa corchetes individuales,

H3 = H2[''SOLD_PRICE'']

entonces H3 se convierte en una Serie. Si H3 es una serie, entonces el resultado que deseas sigue naturalmente:

import pandas as pd import numpy as np rng = pd.date_range(''1/1/2011'', periods=72, freq=''M'') H2 = pd.DataFrame(np.arange(len(rng)), index=rng, columns=[''SOLD_PRICE'']) H3 = H2[''SOLD_PRICE''] H5 = H3.resample(''Q'', how=''count'') H6 = pd.rolling_mean(H5,4) print(H6.head())

rendimientos

2011-03-31 NaN 2011-06-30 NaN 2011-09-30 NaN 2011-12-31 3 2012-03-31 3 dtype: float64


Simplemente llame a reset_index() :

In [130]: s Out[130]: 0 1 1999-03-31 SOLD_PRICE NaN 1999-06-30 SOLD_PRICE NaN 1999-09-30 SOLD_PRICE NaN 1999-12-31 SOLD_PRICE 3 2000-03-31 SOLD_PRICE 3 Name: 2, dtype: float64 In [131]: s.reset_index() Out[131]: 0 1 2 0 1999-03-31 SOLD_PRICE NaN 1 1999-06-30 SOLD_PRICE NaN 2 1999-09-30 SOLD_PRICE NaN 3 1999-12-31 SOLD_PRICE 3 4 2000-03-31 SOLD_PRICE 3

Hay muchas formas de eliminar columnas:

Llame a reset_index() dos veces y especifique una columna:

In [136]: s.reset_index(0).reset_index(drop=True) Out[136]: 0 2 0 1999-03-31 NaN 1 1999-06-30 NaN 2 1999-09-30 NaN 3 1999-12-31 3 4 2000-03-31 3

Eliminar la columna después de restablecer el índice:

In [137]: df = s.reset_index() In [138]: df Out[138]: 0 1 2 0 1999-03-31 SOLD_PRICE NaN 1 1999-06-30 SOLD_PRICE NaN 2 1999-09-30 SOLD_PRICE NaN 3 1999-12-31 SOLD_PRICE 3 4 2000-03-31 SOLD_PRICE 3 In [139]: del df[1] In [140]: df Out[140]: 0 2 0 1999-03-31 NaN 1 1999-06-30 NaN 2 1999-09-30 NaN 3 1999-12-31 3 4 2000-03-31 3

Call drop() después de reiniciar:

In [144]: s.reset_index().drop(1, axis=1) Out[144]: 0 2 0 1999-03-31 NaN 1 1999-06-30 NaN 2 1999-09-30 NaN 3 1999-12-31 3 4 2000-03-31 3

Luego, después de restablecer su índice, simplemente cambie el nombre de las columnas

In [146]: df.columns = [''Date'', ''Sales''] In [147]: df Out[147]: Date Sales 0 1999-03-31 NaN 1 1999-06-30 NaN 2 1999-09-30 NaN 3 1999-12-31 3 4 2000-03-31 3