Comment convertir l'index d'une trame de données pandas en une colonne?


456

Cela semble assez évident, mais je n'arrive pas à comprendre comment convertir un index de trame de données en colonne?

Par exemple:

df=
        gi       ptt_loc
 0  384444683      593  
 1  384444684      594 
 2  384444686      596  

À,

df=
    index1    gi       ptt_loc
 0  0     384444683      593  
 1  1     384444684      594 
 2  2     384444686      596  

Réponses:


763

Soit:

df['index1'] = df.index

ou .reset_index,:

df.reset_index(level=0, inplace=True)

donc, si vous avez une trame multi-index avec 3 niveaux d'index, comme:

>>> df
                       val
tick       tag obs        
2016-02-26 C   2    0.0139
2016-02-27 A   2    0.5577
2016-02-28 C   6    0.0303

et vous voulez convertir les 1er ( tick) et 3e ( obs) niveaux de l'index en colonnes, vous feriez:

>>> df.reset_index(level=['tick', 'obs'])
          tick  obs     val
tag                        
C   2016-02-26    2  0.0139
A   2016-02-27    2  0.5577
C   2016-02-28    6  0.0303

4
gardez à l'esprit que vous devez le faire n fois pour chaque index que vous avez (par exemple, si vous avez deux indices, vous devez le faire deux fois)
dval

34
Avec df.reset_index(level=df.index.names, inplace=True)on peut convertir un multi-index entier donné en colonnes
venti

2
Pouvez-vous avoir un index sur la colonne que vous venez d'ajouter à la trame de données, donc c'est une vraie colonne ET un index?
bretcj7

2
Si vous voulez convertir un multi-index entier, utilisez simplement df.reset_index(), qui déplace l'intégralité de l'index dans les colonnes (une colonne par niveau) et crée un index int de 0 à len (df) -1
BallpointBen

2
L'affectation à une colonne, par exemple, df['index1'] = df.indexrenvoie un avertissement: "Une valeur tente d'être définie sur une copie d'une tranche d'un DataFrame." Utilisez plutôt la fonction df.assign (), comme illustré ci-dessous.
John Mark

36

Pour MultiIndex, vous pouvez extraire son sous-index en utilisant

df['si_name'] = R.index.get_level_values('si_name') 

si_nameest le nom du sous-index.


26

Pour fournir un peu plus de clarté, regardons un DataFrame avec deux niveaux dans son index (un MultiIndex).

index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], 
                                    ['North', 'South']], 
                                   names=['State', 'Direction'])

df = pd.DataFrame(index=index, 
                  data=np.random.randint(0, 10, (6,4)), 
                  columns=list('abcd'))

entrez la description de l'image ici

La reset_indexméthode, appelée avec les paramètres par défaut, convertit tous les niveaux d'index en colonnes et utilise un RangeIndexindex simple comme nouvel.

df.reset_index()

entrez la description de l'image ici

Utilisez le levelparamètre pour contrôler les niveaux d'index convertis en colonnes. Si possible, utilisez le nom du niveau, qui est plus explicite. S'il n'y a pas de nom de niveau, vous pouvez faire référence à chaque niveau par son emplacement entier, qui commence à 0 de l'extérieur. Vous pouvez utiliser ici une valeur scalaire ou une liste de tous les index que vous souhaitez réinitialiser.

df.reset_index(level='State') # same as df.reset_index(level=0)

entrez la description de l'image ici

Dans les rares cas où vous souhaitez conserver l'index et transformer l'index en colonne, vous pouvez effectuer les opérations suivantes:

# for a single level
df.assign(State=df.index.get_level_values('State'))

# for all levels
df.assign(**df.index.to_frame())

15

rename_axis + reset_index

Vous pouvez d'abord renommer votre index en une étiquette souhaitée, puis passer à une série:

df = df.rename_axis('index1').reset_index()

print(df)

   index1         gi  ptt_loc
0       0  384444683      593
1       1  384444684      594
2       2  384444686      596

Cela fonctionne également pour les MultiIndextrames de données:

print(df)
#                        val
# tick       tag obs        
# 2016-02-26 C   2    0.0139
# 2016-02-27 A   2    0.5577
# 2016-02-28 C   6    0.0303

df = df.rename_axis(['index1', 'index2', 'index3']).reset_index()

print(df)

       index1 index2  index3     val
0  2016-02-26      C       2  0.0139
1  2016-02-27      A       2  0.5577
2  2016-02-28      C       6  0.0303

4

Si vous souhaitez utiliser la reset_indexméthode et également conserver votre index existant, vous devez utiliser:

df.reset_index().set_index('index', drop=False)

ou pour le changer en place:

df.reset_index(inplace=True)
df.set_index('index', drop=False, inplace=True)

Par exemple:

print(df)
          gi  ptt_loc
0  384444683      593
4  384444684      594
9  384444686      596

print(df.reset_index())
   index         gi  ptt_loc
0      0  384444683      593
1      4  384444684      594
2      9  384444686      596

print(df.reset_index().set_index('index', drop=False))
       index         gi  ptt_loc
index
0          0  384444683      593
4          4  384444684      594
9          9  384444686      596

Et si vous voulez vous débarrasser de l'étiquette d'index, vous pouvez le faire:

df2 = df.reset_index().set_index('index', drop=False)
df2.index.name = None
print(df2)
   index         gi  ptt_loc
0      0  384444683      593
4      4  384444684      594
9      9  384444686      596

2
df1 = pd.DataFrame({"gi":[232,66,34,43],"ptt":[342,56,662,123]})
p = df1.index.values
df1.insert( 0, column="new",value = p)
df1

    new     gi     ptt
0    0      232    342
1    1      66     56 
2    2      34     662
3    3      43     123

5
Je suggérerais d'ajouter une discussion sur la raison pour laquelle vous pensez que cette réponse est meilleure que les réponses existantes ...
dmcgrandle

0

Une façon très simple de le faire est d'utiliser la méthode reset_index (). Pour une trame de données df, utilisez le code ci-dessous:

df.reset_index(inplace=True)

De cette façon, l'index deviendra une colonne, et en utilisant inplace comme True, cela deviendra un changement permanent.


1
En quoi cette réponse est-elle différente de la réponse déjà acceptée?
Annosz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.