Dado un diccionario de tramas de datos como:

dict = {'ABC': df1, 'XYZ' : df2}   # of any length...

donde cada marco de datos tiene las mismas columnas y similares índice, por ejemplo:

data           Open     High      Low    Close   Volume
Date                                                   
2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833
2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866
2002-01-21  0.19523  0.20970  0.19162  0.20608   771149

¿Cuál es la forma más sencilla de combinar todas las tramas de datos en una sola, con un multi-índice como:

symbol         ABC                                       XYZ
data           Open     High      Low    Close   Volume  Open ...
Date                                                   
2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833  ...
2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866  ...
2002-01-21  0.19523  0.20970  0.19162  0.20608   771149  ...

Yo he probado un par de métodos – por ejemplo, para cada marco de datos reemplazar las columnas con un multi-índice como .from_product(['ABC', columns]) y luego concatenar a lo largo de axis=1, sin éxito.

InformationsquelleAutor Zero | 2014-05-12

2 Comentarios

  1. 66

    Usted puede hacerlo con concat (el keys argumento crear la jerarquía de las columnas de índice):

    d = {'ABC' : df1, 'XYZ' : df2}
    print pd.concat(d.values(), axis=1, keys=d.keys())
    
    
                    XYZ                                          ABC           \
                   Open     High      Low    Close   Volume     Open     High   
    Date                                                                        
    2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833  0.18077  0.18800   
    2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866  0.18439  0.21331   
    2002-01-21  0.19523  0.20970  0.19162  0.20608   771149  0.19523  0.20970   
    
    
                    Low    Close   Volume  
    Date                                   
    2002-01-17  0.16993  0.18439  1720833  
    2002-01-18  0.18077  0.19523  2027866  
    2002-01-21  0.19162  0.20608   771149

    Realmente concat quiere listas para el siguiente es equivalente:

    print(pd.concat([df1, df2], axis=1, keys=['ABC', 'XYZ']))
    • No creo que se necesite de la lista de constructor en Python 3. Podría haber cambiado con los nuevos pandas versiones.
    • estás en lo correcto acerca de la versión actual de los pandas. Creo que he contestado a esta originalmente cuando la mayoría de las personas estaban usando 0.13.0 o 0.13.1
    • como discutido en esta última pregunta, mediante d.values y d.keys de esta manera, debe ser evitado, ya que no se garantiza que el pedido se mantendrá. Considere la posibilidad de keys, values = zip(*d.items())
    • Pensé que la orden fue arbitraria, pero coherente? Es que no es verdad? Mientras sea consistente a través de las llamadas, está bien para este caso de uso.
    • estás en lo correcto. python2 docs. Este punto se discute también a algunos de longitud en esta pregunta.
  2. 2

    Agregar un símbolo de la columna a su dataframes y establecer el índice de incluir el símbolo de la columna, concat y, a continuación, desapilar, a ese nivel:

    La siguiente asume que hay tantos símbolos como DataFrames en su diccionario, y también que compruebe que el orden de los símbolos es como desea que se basa en el orden de la dict claves:

    DF_dict = {'ABC': df1, 'XYZ' : df2} 
    dict_keys = DF_dict.keys()
    symbols = ['ABC', 'ZXY']
    
    for x in xrange(len(symbols)):
        DF_dict[dict_keys[x]]['symbol'] = symbols[x]
        DF_dict[dict_keys[x]].reset_index(inplace = True)
        DF_dict[dict_keys[x]].set_index(['symbol', 'Date'], inplace = True)
    
    DF = pd.concat(DF_dict[df] for df in dict_keys)
    DF = DF.unstack('symbol')

    Creo que sería el enfoque que me gustaría tener. Algunas personas están en contra de la inplace sintaxis. Yo lo uso aquí sólo para su comodidad.

    • No era capaz de probar esta como no tenía los datos, pero se trataba de algo que escribí anteriormente. Déjame saber si funciona….
    • Que trabaja – el concepto clave es el de agregar una columna y, a continuación, gire/desapilar, etc. Me quedé pensando en añadir filas o encabezados de columna.
    • Sí, pero Karl D la respuesta podría ser mejor para usted. Véase la respuesta a continuación. Es mucho más sucinto

Dejar respuesta

Please enter your comment!
Please enter your name here