Bagaimana cara mengubah indeks bingkai data panda menjadi kolom?


456

Ini tampaknya agak jelas, tetapi saya tidak bisa menemukan cara mengubah indeks bingkai data menjadi kolom?

Sebagai contoh:

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

Untuk,

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

Jawaban:


763

antara:

df['index1'] = df.index

atau .reset_index,:

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

jadi, jika Anda memiliki bingkai multi-indeks dengan 3 level indeks, seperti:

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

dan Anda ingin mengubah level 1 ( tick) dan 3 ( obs) dalam indeks menjadi kolom, Anda harus melakukan:

>>> 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
perlu diingat bahwa Anda harus melakukan ini n kali untuk setiap indeks yang Anda miliki (misalnya jika Anda memiliki dua indeks, maka Anda harus melakukannya dua kali)
dval

34
Dengan df.reset_index(level=df.index.names, inplace=True)satu dapat mengkonversi seluruh multiindex menjadi kolom
venti

2
Bisakah Anda memiliki indeks pada kolom yang baru saja Anda tambahkan ke kerangka data sehingga kolom yang benar DAN indeks?
bretcj7

2
Jika Anda ingin mengonversi multiindex keseluruhan, cukup gunakan df.reset_index(), yang memindahkan keseluruhan indeks ke dalam kolom (satu kolom per level) dan membuat indeks int dari 0 hingga len (df) -1
BallpointBen

2
Tugas ke kolom, misalnya df['index1'] = df.indexmengembalikan peringatan: "Nilai berusaha ditetapkan pada salinan sepotong dari DataFrame." Gunakan fungsi df.assign (), seperti yang ditunjukkan di bawah ini.
John Mark

36

Untuk MultiIndex Anda dapat mengekstrak subindeksnya menggunakan

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

di mana si_namenama subindex.


26

Untuk memberikan kejelasan yang lebih, mari kita lihat DataFrame dengan dua level dalam indeksnya (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'))

masukkan deskripsi gambar di sini

The reset_indexmetode, yang disebut dengan parameter default, mengkonversi semua tingkat indeks untuk kolom dan menggunakan sederhana RangeIndexsebagai indeks baru.

df.reset_index()

masukkan deskripsi gambar di sini

Gunakan levelparameter untuk mengontrol level indeks mana yang dikonversi menjadi kolom. Jika memungkinkan, gunakan nama level, yang lebih eksplisit. Jika tidak ada nama level, Anda dapat merujuk ke setiap level dengan lokasi integernya, yang dimulai dari 0 dari luar. Anda dapat menggunakan nilai skalar di sini atau daftar semua indeks yang ingin Anda atur ulang.

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

masukkan deskripsi gambar di sini

Jika Anda ingin mempertahankan indeks dan mengubah indeks menjadi kolom, Anda dapat melakukan hal berikut:

# 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

Pertama-tama Anda dapat mengubah nama indeks menjadi label yang diinginkan, kemudian naik ke seri:

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

Ini juga berfungsi untuk MultiIndexkerangka data:

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

Jika Anda ingin menggunakan reset_indexmetode ini dan juga mempertahankan indeks yang ada, Anda harus menggunakan:

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

atau untuk mengubahnya di tempat:

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

Sebagai contoh:

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

Dan jika Anda ingin menyingkirkan label indeks yang dapat Anda lakukan:

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
Saya menyarankan menambahkan beberapa diskusi tentang mengapa Anda berpikir jawaban ini lebih baik daripada jawaban yang ada ...
dmcgrandle

0

Cara yang sangat sederhana untuk melakukannya adalah dengan menggunakan metode reset_index (). Untuk kerangka data, gunakan kode di bawah ini:

df.reset_index(inplace=True)

Dengan cara ini, indeks akan menjadi kolom, dan dengan menggunakan inplace sebagai True, ini menjadi perubahan permanen.


1
Bagaimana jawaban ini berbeda dari jawaban yang diterima sebelumnya?
Annosz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.