Extendiendo el marco de un panel de pandas a lo largo del eje menor.

Me gustaría extender un dataframe del Panel a lo largo de un eje menor en pandas. Comencé creando un dic de DataFrame s para generar un Panel.

 import pandas as pd import numpy as np rng = pd.date_range('1/1/2013',periods=100,freq='D') df1 = pd.DataFrame(np.random.randn(100, 4), index = rng, columns = ['A','B','C','D']) df2 = pd.DataFrame(np.random.randn(100, 4), index = rng, columns = ['A','B','C','D']) df3 = pd.DataFrame(np.random.randn(100, 4), index = rng, columns = ['A','B','C','D']) pf = pd.Panel({'df1':df1,'df2':df2,'df3':df3}) 

Como era de esperar, encuentro que tengo un panel con las siguientes dimensiones:

Dimensiones: 3 (elementos) x 100 (eje mayor) 4 ejes (eje menor) Ejes: df1 a df3 Eje principal: 2013-01-01 00:00:00 a 2013-04-10 00:00:00 Eje eje menor: A a D

Ahora me gustaría agregar un nuevo conjunto de datos al eje Menor:

 pf['df1']['E'] = pd.DataFrame(np.random.randn(100, 1), index = rng) pf['df2']['E'] = pd.DataFrame(np.random.randn(100, 1), index = rng) pf['df2']['E'] = pd.DataFrame(np.random.randn(100, 1), index = rng) 

Me parece que después de agregar este nuevo eje menor, la forma de las dimensiones de la matriz del panel no ha cambiado:

 shape(pf) 

[3,100,4]

Puedo acceder a los datos de cada uno de los ítems en el major_axis:

 pf.ix['df1',-10:,'E'] 

2013-04-01 0.168205 2013-04-02 0.677929 2013-04-03 0.845444 2013-04-04 0.431610 2013-04-05 0.501003 2013-04-06 -0.403605 2013-04-07 -0.185033 2013-04-08 0.270093 2013-04-09 1.569180 2013-04-10 -1.374779 Freq: D, Nombre: E

Pero si extiendo el corte para incluir más de un eje principal:

 pf.ix[:,:,'E'] 

Entonces encuentro un error que dice que ‘E’ es desconocida.

¿Alguien puede sugerir dónde me voy mal o una mejor manera de realizar esta operación?

Esto no funciona ahora, vea esto, https://github.com/pydata/pandas/issues/2578 Pero puede lograr lo que quiera de esta manera. Esta es una operación bastante barata ya que no se copia nada.

 In [18]: x = pf.transpose(2,0,1) In [19]: x Out[19]:  Dimensions: 4 (items) x 3 (major_axis) x 100 (minor_axis) Items axis: A to D Major_axis axis: df1 to df3 Minor_axis axis: 2013-01-01 00:00:00 to 2013-04-10 00:00:00 In [20]: x['E'] = new_df In [21]: x.transpose(1,2,0) Out[21]:  Dimensions: 3 (items) x 100 (major_axis) x 5 (minor_axis) Items axis: df1 to df3 Major_axis axis: 2013-01-01 00:00:00 to 2013-04-10 00:00:00 Minor_axis axis: A to E 

Parece que el error fue arreglado pero tu pregunta me interesó.

Ya que puede agregar efectivamente un corte a un panel en el eje mayor y menor sin transponer, las siguientes 2 líneas pueden evitar rascarse la cabeza en el tamaño del Dataframe …

 pf.ix[:,'another major axis',:] = pd.DataFrame(np.random.randn(pf.minor_axis.shape[0],pf.items.shape[0]), index=pf.minor_axis, columns=pf.items) pf.ix[:, :, 'another minor axis'] = pd.DataFrame(np.random.randn(pf.major_axis.shape[0],pf.items.shape[0]), index=pf.major_axis, columns=pf.items) 

Me pregunté sin embargo si había algo más simple?

Debajo de la pieza de código que agrega rodajas a lo largo de varios ejes.

 import pandas as pd import numpy as np rng = pd.date_range('25/11/2014', periods=2, freq='D') df1 = pd.DataFrame(np.random.randn(2, 5), index=rng, columns=['A', 'B', 'C', 'D', 'E']) df2 = pd.DataFrame(np.random.randn(2, 5), index=rng, columns=['A', 'B', 'C', 'D', 'E']) df3 = pd.DataFrame(np.random.randn(2, 5), index=rng, columns=['A', 'B', 'C', 'D', 'E']) pf = pd.Panel({'df1': df1, 'df2': df2, 'df3': df3}) # print("slice before adding df4:\n") # for i in pf.items: # print("{}:\n{}".format(i, pf[i])) pf['df4'] = pd.DataFrame(np.random.randn(pf.major_axis.shape[0], pf.minor_axis.shape[0]), index=pf.major_axis, columns=pf.minor_axis) print pf # print("slice after df4 before transposing 1:\n") # for i in pf.items: # print("{}:\n{}".format(i, pf[i])) x = pf.transpose(1, 0, 2) x['new major axis item'] = pd.DataFrame(np.random.randn(pf.items.shape[0], pf.minor_axis.shape[0]), index=pf.items, columns=pf.minor_axis) pf = x.transpose(1, 0, 2) print pf # print("slice after:\n") # for i in pf.items: # print("{}:\n{}".format(i, pf[i])) print("success on adding slice on major axis:") print pf.major_xs(key='new major axis item') print("trying to add major axis directly") pf.ix[:,'another major axis',:] = pd.DataFrame(np.random.randn(pf.minor_axis.shape[0],pf.items.shape[0]), index=pf.minor_axis, columns=pf.items) print pf.major_xs(key='another major axis') print pf