Saya memiliki DataFrame menggunakan panda dan label kolom yang perlu saya edit untuk mengganti label kolom asli.
Saya ingin mengubah nama kolom dalam DataFrame di A
mana nama kolom aslinya adalah:
['$a', '$b', '$c', '$d', '$e']
untuk
['a', 'b', 'c', 'd', 'e'].
Saya memiliki nama kolom yang diedit menyimpannya dalam daftar, tetapi saya tidak tahu bagaimana cara mengganti nama kolom.
Jawaban:
Cukup tetapkan ke
.columns
atribut:sumber
new_columns = df.columns.values;
new_columns[0] = 'XX';
df.columns = new_columns
df.rename(columns = {'$b':'B'}, inplace = True)
RENAME COLUMNS SPESIFIK
Gunakan
df.rename()
fungsi dan rujuk kolom yang akan diganti namanya. Tidak semua kolom harus diganti namanya:Contoh Kode Minimal
Metode berikut semuanya bekerja dan menghasilkan output yang sama:
Ingatlah untuk mengembalikan hasilnya, karena modifikasi tidak ada di tempat. Atau, sebutkan
inplace=True
:Dari v0.25, Anda juga dapat menentukan
errors='raise'
untuk meningkatkan kesalahan jika kolom-untuk-mengganti nama tidak valid ditentukan. Lihat v0.25rename()
docs .REASSIGN COLUMN HEADERS
Gunakan
df.set_axis()
denganaxis=1
daninplace=False
(untuk mengembalikan salinan).Ini mengembalikan salinan, tetapi Anda dapat memodifikasi DataFrame di tempat dengan menetapkan
inplace=True
(ini adalah perilaku default untuk versi <= 0,24 tetapi kemungkinan akan berubah di masa depan).Anda juga dapat menetapkan tajuk secara langsung:
sumber
code
<class 'pandas.core.frame.DataFrame'> Int64Index: 1000 entri, 0 hingga 999 Kolom data: BodyMarkdown 1000code
karya bukan nol , tetapi ketika saya melakukan dataframe.head () nama-nama lama untuk kolom muncul kembali.SettingWithCopyWarning:
ketika saya menggunakan potongan kode kedua dalam jawaban ini.df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
mengubah nama yang ditampilkan, tetapi tidak elemen dalam struktur data yang mendasarinya. Jadi, jika Anda mencoba,df['newName1']
Anda akan mendapatkan kesalahan. Halinplace=True
ini diperlukan untuk menghindari gotchya itu.The
rename
Metode dapat mengambil fungsi , misalnya:sumber
df.rename(columns=lambda x: x.lstrip(), inplace=True)
t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)
adalah permata sehingga kita bisa menulisdf.Column_1_Name
daripada menulisdf.loc[:, 'Column 1 Name']
.Seperti yang didokumentasikan dalam Bekerja dengan data teks :
sumber
Panda 0,21+ Jawab
Ada beberapa pembaruan signifikan untuk penggantian nama kolom di versi 0.21.
rename
Metode telah menambahkanaxis
parameter yang dapat diatur kecolumns
atau1
. Pembaruan ini membuat metode ini cocok dengan API panda lainnya. Masih memilikiindex
dancolumns
parameter tetapi Anda tidak lagi dipaksa untuk menggunakannya.set_axis
Metode denganinplace
set untukFalse
memungkinkan Anda untuk mengubah nama semua indeks atau kolom label dengan daftar.Contoh untuk Pandas 0.21+
Buat sampel DataFrame:
Menggunakan
rename
denganaxis='columns'
atauaxis=1
atau
Keduanya menghasilkan sebagai berikut:
Masih mungkin menggunakan tanda tangan metode lama:
The
rename
Fungsi juga menerima fungsi yang akan diterapkan untuk setiap nama kolom.atau
Menggunakan
set_axis
dengan daftar daninplace=False
Anda dapat menyediakan daftar ke
set_axis
metode yang panjangnya sama dengan jumlah kolom (atau indeks). Saat ini,inplace
default untukTrue
, tetapiinplace
akan defaultFalse
pada rilis mendatang.atau
Kenapa tidak digunakan
df.columns = ['a', 'b', 'c', 'd', 'e']
?Tidak ada yang salah dengan menetapkan kolom langsung seperti ini. Ini adalah solusi yang sangat bagus.
Keuntungan menggunakan
set_axis
adalah dapat digunakan sebagai bagian dari rantai metode dan mengembalikan salinan DataFrame baru. Tanpanya, Anda harus menyimpan langkah perantara rantai ke variabel lain sebelum menetapkan ulang kolom.sumber
Pandas 0.21+ answer
- entah bagaimana saya melewatkan bagian itu di bagian "apa yang baru" ...(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
Karena Anda hanya ingin menghapus $ sign di semua nama kolom, Anda bisa melakukan:
ATAU
sumber
Itu akan mengganti nama yang ada dengan nama yang Anda berikan, dalam urutan yang Anda berikan.
sumber
df.columns.values
, itu salah. stackoverflow.com/questions/43291781/…Dengan cara ini Anda dapat mengedit secara manual
new_names
sesuai keinginan. Bekerja dengan baik ketika Anda perlu mengganti nama hanya beberapa kolom untuk memperbaiki kesalahan ejaan, aksen, menghapus karakter khusus dll.sumber
df.columns = ['a', 'b', 'c', 'd', 'e']
lebih sederhana.df.columns.values
untuk mendapatkan nama-nama lama.myList = list(df) myList[10:20]
:, dll - jadi ini sempurna.namez = df.columns.values
diikuti dengan beberapa pengeditan, kemudiandf.columns = namez
.Satu jalur atau solusi Pipeline
Saya akan fokus pada dua hal:
OP dengan jelas menyatakan
Saya tidak ingin menyelesaikan masalah tentang cara mengganti
'$'
atau menghapus karakter pertama dari setiap tajuk kolom. OP telah melakukan langkah ini. Alih-alih saya ingin fokus mengganticolumns
objek yang ada dengan yang baru diberi daftar nama kolom pengganti.df.columns = new
di mananew
daftar nama kolom baru sesederhana yang didapatnya. Kekurangan dari pendekatan ini adalah bahwa itu memerlukan pengeditancolumns
atribut dataframe yang ada dan tidak dilakukan inline. Saya akan menunjukkan beberapa cara untuk melakukan ini melalui pipelining tanpa mengedit kerangka data yang ada.Setup 1
Untuk fokus pada kebutuhan untuk mengganti nama ganti nama kolom dengan daftar yang sudah ada sebelumnya, saya akan membuat contoh dataframe baru
df
dengan nama kolom awal dan nama kolom baru yang tidak terkait.Solusi 1
pd.DataFrame.rename
Sudah dikatakan bahwa jika Anda memiliki kamus yang memetakan nama kolom lama ke nama kolom baru, Anda dapat menggunakan
pd.DataFrame.rename
.Namun, Anda dapat dengan mudah membuat kamus itu dan memasukkannya ke dalam panggilan ke
rename
. Berikut ini mengambil keuntungan dari fakta bahwa ketika mengulangidf
, kami mengulangi setiap nama kolom.Ini berfungsi baik jika nama kolom asli Anda unik. Tetapi jika tidak, maka ini rusak.
Setup 2
kolom non-unik
Solusi 2
pd.concat
menggunakankeys
argumenPertama, perhatikan apa yang terjadi ketika kami mencoba menggunakan solusi 1:
Kami tidak memetakan
new
daftar sebagai nama kolom. Kami akhirnya mengulangiy765
. Sebagai gantinya, kita bisa menggunakankeys
argumenpd.concat
fungsi sambil mengulangi melalui kolomdf
.Solusi 3
Rekonstruksi. Ini seharusnya hanya digunakan jika Anda memiliki satu
dtype
untuk semua kolom. Jika tidak, Anda akan mendapatkandtype
object
semua kolom dan mengonversinya kembali memerlukan lebih banyak pekerjaan kamus.Tunggal
dtype
Campuran
dtype
Solusi 4
Ini adalah trik menarik perhatian dengan
transpose
danset_index
.pd.DataFrame.set_index
memungkinkan kita untuk mengatur inline indeks tetapi tidak ada yang sesuaiset_columns
. Jadi kita bisa memindahkan, laluset_index
, dan memindahkan kembali. Namun, peringatan tunggaldtype
versus campuran yang samadtype
dari solusi 3 berlaku di sini.Tunggal
dtype
Campuran
dtype
Solusi 5
Gunakan a
lambda
dalampd.DataFrame.rename
siklus itu melalui setiap elemennew
Dalam solusi ini, kami melewati lambda yang mengambil
x
tetapi kemudian mengabaikannya. Ini juga membutuhkany
tetapi tidak mengharapkannya. Sebagai gantinya, sebuah iterator diberikan sebagai nilai default dan saya kemudian dapat menggunakannya untuk menggilir satu per satu tanpa memperhatikan apa nilainyax
.Dan seperti yang ditunjukkan kepada saya oleh orang-orang di obrolan sopython , jika saya menambahkan
*
di antaranyax
dany
, saya dapat melindungiy
variabel saya . Padahal, dalam konteks ini saya tidak percaya itu perlu dilindungi. Masih layak disebut.sumber
df.rename(lambda x : x.lstrip('$'),axis=1)
x
diabaikan?Nama kolom vs Nama Seri
Saya ingin menjelaskan sedikit apa yang terjadi di balik layar.
Dataframe adalah serangkaian Series.
Seri pada gilirannya adalah perpanjangan dari a
numpy.array
numpy.array
Memiliki properti.name
Ini adalah nama seri. Jarang panda menghormati atribut ini, tetapi panda tetap ada di tempat dan dapat digunakan untuk meretas beberapa perilaku panda.
Memberi nama daftar kolom
Banyak jawaban di sini berbicara tentang
df.columns
atribut menjadilist
ketika sebenarnya itu adalahSeries
. Ini berarti ia memiliki.name
atribut.Inilah yang terjadi jika Anda memutuskan untuk mengisi nama kolom
Series
:Perhatikan bahwa nama indeks selalu lebih rendah satu kolom.
Artefak yang tertinggal
The
.name
Atribut tetap hidup di kadang-kadang. Jika Anda mengaturdf.columns = ['one', 'two']
makadf.one.name
akan menjadi'one'
.Jika Anda mengatur
df.one.name = 'three'
makadf.columns
akan tetap memberi Anda['one', 'two']
, dandf.one.name
akan memberi Anda'three'
TAPI
pd.DataFrame(df.one)
akan kembaliKarena panda menggunakan kembali
.name
dari yang sudah didefinisikanSeries
.Nama kolom multi level
Panda memiliki cara melakukan nama kolom berlapis-lapis. Tidak ada begitu banyak sihir yang terlibat, tetapi saya ingin membahas hal ini dalam jawaban saya juga karena saya tidak melihat ada yang mengambil ini di sini.
Ini mudah dicapai dengan mengatur kolom ke daftar, seperti ini:
sumber
Jika Anda memiliki kerangka data, df.columns membuang semuanya ke dalam daftar yang dapat Anda manipulasi dan kemudian menetapkan kembali ke dalam kerangka data Anda sebagai nama-nama kolom ...
Cara terbaik? IDK. Cara - ya.
Cara yang lebih baik untuk mengevaluasi semua teknik utama yang diajukan dalam jawaban atas pertanyaan di bawah ini menggunakan cProfile untuk mengukur memori & waktu eksekusi. @kadee, @kaitlyn, & @eumiro memiliki fungsi dengan waktu eksekusi tercepat - meskipun fungsi ini sangat cepat, kami membandingkan pembulatan 0,000 dan 0,001 detik untuk semua jawaban. Moral: jawaban saya di atas kemungkinan bukan cara 'Terbaik'.
sumber
Katakanlah ini adalah kerangka data Anda.
Anda dapat mengubah nama kolom menggunakan dua metode.
Menggunakan
dataframe.columns=[#list]
Batasan metode ini adalah bahwa jika satu kolom harus diubah, daftar kolom lengkap harus dilewati. Juga, metode ini tidak berlaku pada label indeks. Misalnya, jika Anda melewati ini:
Ini akan menimbulkan kesalahan. Panjang ketidakcocokan: Sumbu yang diharapkan memiliki 5 elemen, nilai baru memiliki 4 elemen.
Metode lain adalah metode Pandas
rename()
yang digunakan untuk mengganti nama indeks, kolom atau barisDemikian pula, Anda dapat mengubah baris atau kolom apa pun.
sumber
Jika daftar kolom baru Anda berada dalam urutan yang sama dengan kolom yang ada, tugasnya sederhana:
Jika kamus Anda dikunci pada nama kolom lama ke nama kolom baru, Anda bisa melakukan hal berikut:
Jika Anda tidak memiliki pemetaan daftar atau kamus, Anda bisa menghapus
$
simbol utama melalui pemahaman daftar:sumber
lambda col: d[col]
Anda bisa lulusd.get
... sehingga akan terlihat sepertidf.columns.map(d.get)
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
sumber
Mari Memahami penggantian nama dengan contoh kecil ...
1.Renaming kolom menggunakan pemetaan:
2.Renaming indeks / Row_Name menggunakan pemetaan:
sumber
Cara lain kita dapat mengganti label kolom asli adalah dengan menghapus karakter yang tidak diinginkan (di sini '$') dari label kolom asli.
Ini bisa dilakukan dengan menjalankan for for di atas df.columns dan menambahkan kolom yang dilucuti ke df.columns.
Sebagai gantinya, kita dapat melakukan ini dengan rapi dalam satu pernyataan dengan menggunakan pemahaman daftar seperti di bawah ini:
(
strip
metode dalam Python menghapus karakter yang diberikan dari awal dan akhir string.)sumber
Sangat sederhana, gunakan saja
dan itu akan menetapkan nama kolom dengan urutan yang Anda masukkan
sumber
Anda bisa menggunakannya
str.slice
untuk itu:sumber
df.columns.str[1:]
... mungkin lebih baik menggunakan itu, lebih pendek dan lebih jelas.Saya tahu pertanyaan dan jawaban ini telah dikunyah sampai mati. Tetapi saya menyebutnya sebagai inspirasi untuk salah satu masalah yang saya alami. Saya bisa menyelesaikannya menggunakan bit dan potongan dari jawaban yang berbeda maka memberikan tanggapan saya jika ada yang membutuhkannya.
Metode saya adalah generik di mana Anda dapat menambahkan pembatas tambahan dengan memisahkan
delimiters=
variabel koma dan bukti masa depan itu.Kode Kerja:
Keluaran:
sumber
Perhatikan bahwa pendekatan ini tidak berfungsi untuk MultiIndex. Untuk MultiIndex, Anda perlu melakukan sesuatu seperti berikut:
sumber
Pilihan lain adalah mengganti nama menggunakan ekspresi reguler:
sumber
Jika Anda harus berurusan dengan banyak kolom yang dinamai oleh sistem yang menyediakan di luar kendali Anda, saya datang dengan pendekatan berikut yang merupakan kombinasi dari pendekatan umum dan penggantian spesifik dalam sekali jalan.
Pertama buat kamus dari nama kolom dataframe menggunakan ekspresi regex untuk membuang lampiran tertentu dari nama kolom dan kemudian tambahkan penggantian khusus ke kamus untuk nama kolom inti seperti yang diharapkan nanti dalam database penerima.
Ini kemudian diterapkan pada kerangka data dalam sekali jalan.
sumber
Selain solusi yang sudah disediakan, Anda dapat mengganti semua kolom saat Anda membaca file. Kita dapat menggunakan
names
danheader=0
melakukan itu.Pertama, kami membuat daftar nama yang ingin kami gunakan sebagai nama kolom kami:
Dalam hal ini, semua nama kolom akan diganti dengan nama yang ada di daftar Anda.
sumber
Inilah fungsi kecil yang bagus yang saya suka gunakan untuk mengurangi pengetikan:
Berikut ini contoh cara kerjanya:
sumber
Mengganti nama kolom dalam panda adalah tugas yang mudah.
sumber
Dengan asumsi Anda dapat menggunakan ekspresi reguler. Solusi ini menghilangkan kebutuhan encoding manual menggunakan regex
sumber