I've punya dataframe yang disebut data
. Bagaimana saya mengubah nama hanya satu kolom header? Misalnya pdb
untuk log(pdb)
?
data =
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
Jauh lebih cepat pelaksanaannya akan menggunakan daftar-pemahaman
jika anda perlu untuk mengubah nama kolom tunggal.
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
Jika timbul kebutuhan untuk mengubah beberapa kolom, baik menggunakan ekspresi kondisional seperti:
df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]
Atau, membangun pemetaan menggunakan kamus
dan melakukan daftar-pemahaman
dengan itu's mendapatkan
operasi dengan menetapkan nilai default sebagai nama lama:
col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'} ## key→old name, value→new name
df.columns = [col_dict.get(x, x) for x in df.columns]
Timing:
%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop
%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop
Bagaimana cara mengganti nama kolom tertentu di panda?
Dari v0.24+, untuk mengubah nama salah satu (atau lebih) kolom pada suatu waktu,
DataFrame.rename()
dengan axis=1
atau axis='kolom'
(sumbu
argumen diperkenalkan di v0.21
.
Index.str.replace()
untuk string/regex berdasarkan penggantian.
Jika anda perlu untuk mengubah nama SEMUA kolom sekaligus,
DataFrame.set_axis()
metode dengan axis=1
. Lulus daftar-seperti urutan. Pilihan yang tersedia untuk di-tempat modifikasi juga. rename
dengan axis=1
df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df
y gdp cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Dengan 0.21+, kini anda dapat menentukan axis
parameter rename
:
df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
(Perhatikan bahwa nama
tidak di tempat secara default, sehingga anda akan perlu untuk menetapkan hasilnya kembali.)
Selain ini telah dilakukan untuk meningkatkan konsistensi dengan sisa API. Baru axis
argumen adalah analog dengan kolom
parameter—mereka melakukan hal yang sama.
df.rename(columns={'gdp': 'log(gdp)'})
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
rename
juga menerima panggilan balik yang dipanggil sekali untuk masing-masing kolom.
df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')
y g c
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Untuk skenario tertentu, anda akan ingin menggunakan
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Index.str.replace
Mirip dengan mengganti
metode string di python, panda Index dan Seri (objek dtype hanya) mendefinisikan ("vectorized") str.ganti
metode untuk string dan regex berbasis pengganti.
df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Keuntungan dari ini dibandingkan metode lain adalah bahwa str.ganti
mendukung ekspresi reguler (diaktifkan secara default). Lihat dokumentasi untuk informasi lebih lanjut.
set_axis
dengan axis=1
Panggilan set_axis
dengan daftar header(s). Daftar tersebut harus sama dengan panjang kolom/ukuran indeks. set_axis
bermutasi asli DataFrame secara default, tetapi anda dapat menentukan inplace=False
untuk kembali salinan dimodifikasi.
df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
cap log(gdp) y
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Catatan: Dalam rilis masa depan, inplace
default Benar
.
Metode Chaining
Mengapa memilih set_axis
ketika kita sudah memiliki cara yang efisien untuk menetapkan kolom dengan df.kolom = ...
? Seperti yang ditunjukkan oleh Ted Petrou dalam [jawaban],(https://stackoverflow.com/a/46912050/4909087) set_axis
ini berguna ketika mencoba untuk rantai metode.
Bandingkan
# new for pandas 0.21+
df.some_method1()
.some_method2()
.set_axis()
.some_method3()
Terhadap
# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
Mantan lebih alami dan bebas mengalir sintaks.