GOOGLE ADS

jeudi 28 avril 2022

Comment sélectionner les colonnes de niveau supérieur dans la trame de données pandas à en-têtes multiples

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 MultiIndexdoivent être triées :

df = df.sort_index(axis=1)

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...