J'ai une trame de données multi-en-tête et ça ressemble à ça:
SPY ARKW
Open High Open High
Bid Ask Bid Ask Bid Ask Bid Ask
Date
2018-07-03 272.86 272.87 272.97 272.98 56.00 56.35 56.24 56.63
2018-07-02 269.49 269.51 272.04 272.05 54.87 55.21 56.04 56.09
2018-06-29 272.09 272.12 273.66 273.67 55.58 55.95 55.95 56.07
Je veux parcourir toutes les colonnes de niveau supérieur, donc dans ce cas SPY et ARKW, j'ai donc essayé:
for column in df:
print(column)
mais il itère également sur les colonnes de niveau inférieur :
('SPY', 'Open', 'Bid')
('SPY', 'Open', 'Ask')
('SPY', 'High', 'Bid')
('SPY', 'High', 'Ask')
('ARKW', 'Open', 'Bid')
('ARKW', 'Open', 'Ask')
('ARKW', 'High', 'Bid')
('ARKW', 'High', 'Ask')
Comment puis-je parcourir les colonnes de niveau supérieur, puis pour chaque colonne d'offre ouverte sélectionnée ?
Solution du problème
Je pense que la boucle n'est pas nécessaire, pour sélectionner use slicers:
idx = pd.IndexSlice
df1 = df.loc[:, idx[:, 'Open', 'Bid']]
print (df1)
SPY ARKW
Open Open
Bid Bid
2018-07-03 272.86 56.00
2018-07-02 269.49 54.87
2018-06-29 272.09 55.58
Ou utilisez DataFrame.xs
:
df1 = df.xs(('Open', 'Bid'), level=[1, 2], axis=1)
print (df1)
SPY ARKW
2018-07-03 272.86 56.00
2018-07-02 269.49 54.87
2018-06-29 272.09 55.58
df1 = df.xs(('Open', 'Bid'), level=[1, 2], axis=1, drop_level=False)
print (df1)
SPY ARKW
Open Open
Bid Bid
2018-07-03 272.86 56.00
2018-07-02 269.49 54.87
2018-06-29 272.09 55.58
ÉDITER:
Pour de meilleures performances, toutes les valeurs MultiIndex
doivent être triées :
df = df.sort_index(axis=1)
Aucun commentaire:
Enregistrer un commentaire