Transformez Pandas Multi-Index en colonne

156

J'ai un dataframe avec 2 niveaux d'index:

                         value
Trial    measurement
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

Ce que je veux transformer en ceci:

Trial    measurement       value

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

Comment puis-je faire cela au mieux?

J'en ai besoin car je souhaite agréger les données comme indiqué ici , mais je ne peux pas sélectionner mes colonnes comme ça si elles sont utilisées comme index.

TheChymera
la source
2
Dupliquer: stackoverflow.com/questions/18624039/... Vous voulez la première suggestion. .reset_index()
TomAugspurger
1
merci beaucoup, en fait, j'ai beaucoup parcouru pour cela, mais "faire du multiindex en colonne" et des requêtes similaires m'ont toujours donné des fils qui voulaient faire pivoter leurs dataframes ...
TheChymera
3
Toujours plus facile de trouver une réponse quand vous la connaissez déjà :)
TomAugspurger

Réponses:

194

Le reset_index () est une méthode de pandas DataFrame qui transférera les valeurs d'index dans le DataFrame sous forme de colonnes. Le paramètre par défaut du paramètre est drop = False (qui conservera les valeurs d'index sous forme de colonnes).

Tout ce que vous avez à faire ajouter .reset_index(inplace=True)après le nom du DataFrame:

df.reset_index(inplace=True)  
CraigSF
la source
3
Pour mon cas où j'avais 3 niveaux d'index en place, la réinitialisation n'a pas fonctionné. Alternative est d'assigner une nouvelle trame de données réinitialisée à une nouvelle: df2 = df.reset_index ()
Gorkem
8
Pour réinitialiser uniquement un ou plusieurs niveaux particuliers, utilisezdf.reset_index(level=[...])
cs95
20

Cela ne s'applique pas vraiment à votre cas, mais pourrait être utile pour d'autres (comme moi il y a 5 minutes) de le savoir. Si un multindex porte le même nom comme ceci:

                         value
Trial        Trial
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

df.reset_index(inplace=True) échouera, car les colonnes créées ne peuvent pas avoir les mêmes noms.

Vous devez donc renommer le multindex avec df.index = df.index.set_names(['Trial', 'measurement'])pour obtenir:

                           value
Trial    measurement       

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

Et puis df.reset_index(inplace=True)fonctionnera comme un charme.

J'ai rencontré ce problème après avoir regroupé par année et par mois sur une colonne datetime (pas d'index) appelée live_date, ce qui signifiait que l'année et le mois étaient nommés live_date.

Karl Anka
la source
1
Comment faire répéter vos valeurs Trial? J'ai eu le même problème et ça marche sauf que mes valeurs ne se répètent pas.
Riche du
4

Comme @ cs95 l'a mentionné dans un commentaire, pour ne supprimer qu'un seul niveau, utilisez:

df.reset_index(level=[...])

Cela évite d'avoir à redéfinir l'index souhaité après la réinitialisation.

sameagol
la source