Jak przekonwertować indeks ramki danych pandy na kolumnę?

456

Wydaje się to dość oczywiste, ale nie potrafię wymyślić, jak przekonwertować indeks ramki danych na kolumnę?

Na przykład:

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

Do,

df=
    index1    gi       ptt_loc
 0  0     384444683      593  
 1  1     384444684      594 
 2  2     384444686      596  
msakya
źródło

Odpowiedzi:

764

zarówno:

df['index1'] = df.index

lub .reset_index:

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

więc jeśli masz ramkę z wieloma indeksami z 3 poziomami indeksu, na przykład:

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

i chcesz przekonwertować poziomy 1st ( tick) i 3rd ( obs) w indeksie na kolumny, zrobiłbyś:

>>> 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
źródło
4
pamiętaj, że musisz to robić n razy dla każdego indeksu, który masz (np. jeśli masz dwa indeksy, musisz to zrobić dwa razy)
dval
34
Za pomocą df.reset_index(level=df.index.names, inplace=True)jednego można przekonwertować cały multiindeks na kolumny
venti
2
Czy możesz mieć indeks w kolumnie właśnie dodanej do ramki danych, aby była to prawdziwa kolumna ORAZ indeks?
bretcj7
2
Jeśli chcesz przekonwertować cały indeks, po prostu użyj df.reset_index(), który przenosi cały indeks do kolumn (jedna kolumna na poziom) i tworzy indeks int od 0 do len (df) -1
BallpointBen
2
Przypisanie do kolumny, np. df['index1'] = df.indexZwraca ostrzeżenie: „Próbuje się ustawić wartość na kopii wycinka z DataFrame”. Zamiast tego użyj funkcji df.assign (), jak pokazano poniżej.
John Mark
36

W przypadku MultiIndex można wyodrębnić jego subindeks za pomocą

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

gdzie si_namejest nazwa subindeksu.

Apogentus
źródło
26

Aby zapewnić nieco większą przejrzystość, spójrzmy na DataFrame z dwoma poziomami w indeksie (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'))

wprowadź opis zdjęcia tutaj

reset_indexMetoda, zwana z domyślnymi parametrami, konwertuje wszystkie poziomy indeksów na kolumny i używa prostego RangeIndexjako nowego indeksu.

df.reset_index()

wprowadź opis zdjęcia tutaj

Za pomocą tego levelparametru można kontrolować, które poziomy indeksu są konwertowane na kolumny. Jeśli to możliwe, użyj nazwy poziomu, która jest bardziej wyraźna. Jeśli nie ma nazw poziomów, możesz odwoływać się do każdego poziomu przez jego liczbę całkowitą, która zaczyna się od 0 od zewnątrz. Możesz użyć tutaj wartości skalarnej lub listy wszystkich indeksów, które chcesz zresetować.

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

wprowadź opis zdjęcia tutaj

W rzadkim przypadku, gdy chcesz zachować indeks i przekształcić go w kolumnę, możesz wykonać następujące czynności:

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

# for all levels
df.assign(**df.index.to_frame())
Ted Petrou
źródło
15

rename_axis + reset_index

Możesz najpierw zmienić nazwę indeksu na pożądaną etykietę, a następnie przejść do serii:

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

Działa to również w przypadku MultiIndexramek danych:

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
źródło
4

Jeśli chcesz użyć tej reset_indexmetody, a także zachować istniejący indeks, powinieneś użyć:

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

lub zmienić to na miejscu:

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

Na przykład:

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

A jeśli chcesz pozbyć się etykiety indeksu, możesz:

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
źródło
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
źródło
5
Sugeruję dodanie dyskusji na temat tego, dlaczego uważasz, że ta odpowiedź jest lepsza niż istniejące odpowiedzi ...
dmcgrandle,
0

Bardzo prostym sposobem na to jest użycie metody reset_index (). W przypadku ramki danych df użyj poniższego kodu:

df.reset_index(inplace=True)

W ten sposób indeks stanie się kolumną, a użycie wartości „inplace” jako „True” spowoduje zmianę na stałe.

maria_g
źródło
1
Czym różni się ta odpowiedź od już przyjętej odpowiedzi?
Annosz