python - unir - pandas unstack
Concatene las columnas de Pandas bajo un nuevo nivel multi-índice (2)
Dado un diccionario de marcos de datos como:
dict = {''ABC'': df1, ''XYZ'' : df2} # of any length...
donde cada marco de datos tiene las mismas columnas y un índice similar, 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 todos los marcos de datos en uno, con un índice múltiple 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 ...
He intentado algunos métodos: por ejemplo, para cada marco de datos, reemplace las columnas con un índice múltiple como .from_product([''ABC'', columns])
y luego concatenar a lo largo del axis=1
, sin éxito.
Agregue una columna de símbolo a sus marcos de datos y configure el índice para incluir la columna de símbolos, concat y luego desaplique ese nivel:
Lo siguiente asume que hay tantos símbolos como DataFrames en su dict, y también que usted verifica que el orden de los símbolos es el que usted quiere según el orden de las claves dict:
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 ese sería el enfoque que tomaría. Algunas personas están en contra de la sintaxis en el lugar. Lo uso aquí solo como conveniencia.
Puede hacerlo con concat
(el argumento de keys
creará el índice de columnas jerárquicas):
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 así que lo siguiente es equivalente:
print pd.concat([df1,df2],axis=1,keys=[''ABC'',''XYZ''])