Pandas: gráfico de barras con dataframe multiIndex

Tengo un DataFrame de pandas con una columna TIMESTAMP (no el índice), y el formato de la marca de tiempo es el siguiente:

 2015-03-31 22:56:45.510 

También tengo columnas llamadas CLASS y AXLES . Me gustaría calcular el recuento de registros para cada mes por separado para cada valor único de AXLES ( AXLES puede tomar un valor entero entre 3-12).

Se me ocurrió una combinación de resample y groupby :

 resamp = dfWIM.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS 

Esto parece darme un objeto de dataframe multiIndex, como se muestra a continuación.

 In [72]: resamp Out [72]: AXLES TIMESTAMP 3 2014-07-31 5517 2014-08-31 31553 2014-09-30 42816 2014-10-31 49308 2014-11-30 44168 2014-12-31 45518 2015-01-31 54782 2015-02-28 52166 2015-03-31 47929 4 2014-07-31 3147 2014-08-31 24810 2014-09-30 39075 2014-10-31 46857 2014-11-30 42651 2014-12-31 48282 2015-01-31 42708 2015-02-28 43904 2015-03-31 50033 

Desde aquí, ¿cómo puedo acceder a los diferentes componentes de este objeto multiIndex para crear un gráfico de barras para las siguientes condiciones?

  • mostrar datos cuando EJES = 3
  • muestre x marcas en el formato de mes – año (sin días, horas, minutos, etc.)

¡Gracias!

EDITAR : El siguiente código me da la ttwig, pero no pude cambiar el formato xtick a MM-YY.

 resamp[3].plot(kind='bar') 

introduzca la descripción de la imagen aquí

EDIT 2 a continuación es un fragmento de código que genera una pequeña muestra de los datos similares a los que tengo:

 dftest = {'TIMESTAMP':['2014-08-31','2014-09-30','2014-10-31'], 'AXLES':[3, 3, 3], 'CLASS':[5,6,7]} dfTest = pd.DataFrame(dftest) dfTest.TIMESTAMP = pd.to_datetime(pd.Series(dfTest.TIMESTAMP)) resamp = dfTest.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS resamp[3].plot(kind='bar') 

EDIT 3: Aquí abajo está la solución:

A.Plote todo el dataframe remuestreado (basado en la sugerencia de @Ako):

 df = resamp.unstack(0) df.index = [ts.strftime('%b 20%y') for ts in df.index] df.plot(kind='bar', rot=0) 

introduzca la descripción de la imagen aquí

B. Marque un índice individual a partir del dataframe remuestreado (según la sugerencia de @Alexander):

 df = resamp[3] df.index = [ts.strftime('%b 20%y') for ts in df.index] df.plot(kind='bar', rot=0) 

introduzca la descripción de la imagen aquí

Lo siguiente debería funcionar, pero es difícil de probar sin algunos datos.

Comience por restablecer su índice para obtener acceso a la columna TIMESTAMP . Luego use strftime para strftime formato a la representación de texto deseada (por ejemplo, mm-yy). Finalmente, restablezca el índice de nuevo a AXLES y TIMESTAMP .

 df = resamp.reset_index() df['TIMESTAMP'] = [ts.strftime('%m-%y') for ts in df.TIMESTAMP] df.set_index(['AXLES', 'TIMESTAMP'], inplace=True) >>> df.xs(3, level=0).plot(kind='bar') 

introduzca la descripción de la imagen aquí

Podría generar y establecer las tags explícitamente utilizando ax.xaxis.set_major_formatter con un ticker.FixedFormatter . Esto le permitirá mantener el MultiIndex de su DataFrame con valores de marca de tiempo, mientras muestra las marcas de hora en el formato deseado %m-%Y :

 import numpy as np import matplotlib.pyplot as plt import pandas as pd import matplotlib.ticker as ticker dftest = {'TIMESTAMP':['2014-08-31','2014-09-30','2014-10-31'], 'AXLES':[3, 3, 3], 'CLASS':[5,6,7]} dfTest = pd.DataFrame(dftest) dfTest.TIMESTAMP = pd.to_datetime(pd.Series(dfTest.TIMESTAMP)) resamp = dfTest.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS ax = resamp[3].plot(kind='bar') ticklabels = [timestamp.strftime('%m-%Y') for axle, timestamp in resamp.index] ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: ticklabels[int(x)])) plt.gcf().autofmt_xdate() plt.show() 

rendimientos introduzca la descripción de la imagen aquí