Wie konvertiere ich den Index eines Pandas-Datenrahmens in eine Spalte?

455

Dies scheint ziemlich offensichtlich, aber ich kann nicht herausfinden, wie ein Index eines Datenrahmens in eine Spalte konvertiert werden kann.

Zum Beispiel:

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

Zu,

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

Antworten:

762

entweder:

df['index1'] = df.index

oder .reset_index:

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

Wenn Sie also einen Multi-Index-Frame mit 3 Indexstufen haben, wie z.

>>> 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

und Sie möchten die 1. ( tick) und 3. ( obs) Ebene im Index in Spalten konvertieren , würden Sie tun:

>>> 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
behzad.nouri
quelle
4
Denken Sie daran, dass Sie dies n-mal für jeden Index tun müssen, den Sie haben (z. B. wenn Sie zwei Indizes haben, dann müssen Sie es zweimal tun)
dval
34
Mit df.reset_index(level=df.index.names, inplace=True)kann man einen bestimmten ganzen Multiindex in Spalten umwandeln
venti
2
Können Sie einen Index für die Spalte haben, die Sie gerade zum Datenrahmen hinzugefügt haben, sodass es sich um eine echte Spalte UND einen Index handelt?
Bretcj7
2
Wenn Sie einen ganzen Multiindex konvertieren möchten, verwenden Sie einfach df.reset_index(), wodurch der gesamte Index in die Spalten verschoben wird (eine Spalte pro Ebene) und ein int-Index von 0 bis len (df) -1 erstellt wird
BallpointBen
2
Die Zuweisung zu einer Spalte gibt z. B. df['index1'] = df.indexeine Warnung zurück: "Es wird versucht, einen Wert für eine Kopie eines Slice aus einem DataFrame festzulegen." Verwenden Sie stattdessen die Funktion df.assign (), wie unten gezeigt.
John Mark
36

Für MultiIndex können Sie den Subindex mit extrahieren

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

Wo si_nameist der Name des Subindex?

Apogentus
quelle
26

Um ein bisschen mehr Klarheit zu schaffen, schauen wir uns einen DataFrame mit zwei Ebenen im Index an (einen 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'))

Geben Sie hier die Bildbeschreibung ein

Die reset_indexMethode, die mit den Standardparametern aufgerufen wird, konvertiert alle Indexebenen in Spalten und verwendet einen einfachen RangeIndexwie neuen Index.

df.reset_index()

Geben Sie hier die Bildbeschreibung ein

Verwenden Sie den levelParameter, um zu steuern, welche Indexstufen in Spalten konvertiert werden. Verwenden Sie nach Möglichkeit den expliziteren Ebenennamen. Wenn keine Ebenennamen vorhanden sind, können Sie auf jede Ebene anhand ihrer ganzzahligen Position verweisen, die von außen bei 0 beginnt. Sie können hier einen Skalarwert oder eine Liste aller Indizes verwenden, die Sie zurücksetzen möchten.

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

Geben Sie hier die Bildbeschreibung ein

In dem seltenen Fall, dass Sie den Index beibehalten und den Index in eine Spalte umwandeln möchten, können Sie Folgendes tun:

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

# for all levels
df.assign(**df.index.to_frame())
Ted Petrou
quelle
15

rename_axis + reset_index

Sie können Ihren Index zuerst in eine gewünschte Bezeichnung umbenennen und dann zu einer Reihe aufheben:

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

Dies funktioniert auch für MultiIndexDatenrahmen:

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
jpp
quelle
4

Wenn Sie die reset_indexMethode verwenden und auch Ihren vorhandenen Index beibehalten möchten, sollten Sie Folgendes verwenden:

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

oder um es an Ort und Stelle zu ändern:

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

Zum Beispiel:

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

Und wenn Sie die Indexbezeichnung entfernen möchten, können Sie Folgendes tun:

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
Bunji
quelle
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
Avneesh Hota
quelle
5
Ich würde vorschlagen, eine Diskussion darüber hinzuzufügen, warum Sie denken, dass diese Antwort besser ist als bestehende Antworten ...
dmcgrandle
0

Eine sehr einfache Möglichkeit hierfür ist die Verwendung der Methode reset_index (). Verwenden Sie für einen Datenrahmen df den folgenden Code:

df.reset_index(inplace=True)

Auf diese Weise wird der Index zu einer Spalte, und wenn Sie inplace als True verwenden, wird dies zu einer dauerhaften Änderung.

maria_g
quelle
1
Wie unterscheidet sich diese Antwort von der bereits akzeptierten Antwort?
Annosz