Étant donné un dictionnaire de trames de données comme:
dict = {'ABC': df1, 'XYZ' : df2} # of any length...
où chaque bloc de données a les mêmes colonnes et un index similaire, par exemple:
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
Quelle est la façon la plus simple de combiner toutes les trames de données en une seule, avec un multi-index comme:
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 ...
J'ai essayé quelques méthodes - par exemple, pour chaque bloc de données, remplacez les colonnes par un multi-index comme .from_product(['ABC', columns])
puis concaténez le long de axis=1
, Sans succès.
Vous pouvez le faire avec concat
(l'argument keys
créera l'index des colonnes hiérarchiques):
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
Vraiment concat
veut des listes donc ce qui suit est équivalent:
print(pd.concat([df1, df2], axis=1, keys=['ABC', 'XYZ']))
Ajoutez une colonne de symboles à vos cadres de données et définissez l'index pour inclure la colonne de symboles, concattez puis dépilez ce niveau:
Ce qui suit suppose qu'il y a autant de symboles que de DataFrames dans votre dict et que vous vérifiez que l'ordre des symboles est comme vous le souhaitez en fonction de l'ordre des touches de 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')
Je pense que ce serait l'approche que j'adopterais. Certaines personnes sont contre la syntaxe inplace
. Je ne l'utilise ici que par commodité.