web-dev-qa-db-fra.com

Transformez Pandas Multi-Index en colonne

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 le faire au mieux?

J'ai besoin de cela parce que je veux agréger les données comme indiqué ici , mais je ne peux pas sélectionner mes colonnes de cette manière si elles sont utilisées comme index.

118
TheChymera

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

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

df.reset_index(inplace=True)  
152
CraigSF

Cela ne s'applique pas vraiment à votre cas, mais cela pourrait être utile pour d'autres personnes (comme moi il y a 5 minutes) de savoir. Si un multindex porte les mêmes noms, 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) va échouer car les colonnes créées ne peuvent pas partager les 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 (non index) appelée live_date, ce qui signifiait que l'année et le mois étaient nommés live_date.

16
Karl Anka

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

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

Cela évite de devoir redéfinir l'index souhaité après la réinitialisation.

2
sameagol