Mengubah nama kolom tertentu dalam panda DataFrame

195

Saya sedang mencari cara yang elegan untuk mengubah nama kolom yang ditentukan dalam a DataFrame.

mainkan data ...

import pandas as pd
d = {
         'one': [1, 2, 3, 4, 5],
         'two': [9, 8, 7, 6, 5],
         'three': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

Solusi paling elegan yang saya temukan sejauh ini ...

names = df.columns.tolist()
names[names.index('two')] = 'new_name'
df.columns = names

Saya berharap untuk satu-liner sederhana ... upaya ini gagal ...

df.columns[df.columns.tolist().index('one')] = 'another_name'

Semua petunjuk diterima dengan rasa terima kasih.

Tandai Grafik
sumber

Jawaban:

355

Satu liner memang ada:

In [27]: df=df.rename(columns = {'two':'new_name'})

In [28]: df
Out[28]: 
  one three  new_name
0    1     a         9
1    2     b         8
2    3     c         7
3    4     d         6
4    5     e         5

Berikut ini adalah dokumentasi untuk renamemetode ini.

Definisi: df.rename (mandiri, indeks = Tidak ada, kolom = Tidak ada, salin = Benar, inplace = Salah)
Mendokumentasikan:
Ubah indeks dan / atau kolom menggunakan fungsi input atau
fungsi. Nilai fungsi / dikte harus unik (1-ke-1). Label tidak
terkandung dalam dict / Series akan dibiarkan apa adanya.

Parameter
----------
index: seperti dict atau fungsi, opsional
    Transformasi berlaku untuk nilai indeks
kolom: seperti dict atau fungsi, opsional
    Transformasi berlaku untuk nilai kolom
copy: boolean, default True
    Juga menyalin data yang mendasarinya
inplace: boolean, default False
    Apakah akan mengembalikan DataFrame baru. Jika Benar maka nilai salinannya adalah
    diabaikan.

Lihat juga
--------
Series.rename

Kembali
-------
berganti nama: DataFrame (objek baru)
Nipun Batra
sumber
Ini tidak berfungsi untuk saya kecuali saya menggunakan inplace = True seperti yang ditunjukkan pada balasan @ Jeong-Yoon Lee.
JStrahl
108

Karena inplaceargumen tersedia, Anda tidak perlu menyalin dan menetapkan kembali kerangka data asli, tetapi lakukan sebagai berikut:

df.rename(columns={'two':'new_name'}, inplace=True)
Jeong-Yoon Lee
sumber
39

Bagaimana dengan?

df.columns.values[2] = "new_name"
Yakub H
sumber
11
sebenarnya itu tidak berfungsi jika nanti Anda menggunakan nama kolom pada operasi lain seperti di df ['new_name']
Master Yogurt
4
jawaban ini bermanfaat bagi saya untuk mengubah kolom tertentu ke nama baru. Kolom 1 adalah indeks 0, kolom 2 adalah indeks 1, dan seterusnya. solusi yang bagus .. dan saya yakin ini akan membantu lebih banyak orang .. karena solusi lain mengharuskan Anda untuk mengetahui dan menyalin nama kolom asli sebelumnya .... sementara ini adalah metode cepat dan kotor .. yang memiliki kegunaan sendiri.
ihightower
1
@MasterYogurt komentar Anda tidak benar. Dimungkinkan untuk melakukan df['new_name'](dan hal-hal panda lainnya) setelah mengubah variabel seperti diuraikan di atas. Komentar Anda mungkin valid ketika aslinya dikirim.
Jacob H
1
Yang sedang berkata, menggunakan renamemetode adalah solusi yang lebih baik.
Jacob H
6

Panda 0,21 sekarang memiliki parameter sumbu

Metode rename telah memperoleh parameter sumbu untuk mencocokkan sebagian besar dari sisa API panda.

Jadi, selain ini:

df.rename(columns = {'two':'new_name'})

Anda dapat melakukan:

df.rename({'two':'new_name'}, axis=1)

atau

df.rename({'two':'new_name'}, axis='columns')
Ted Petrou
sumber
df.rename ({'two': 'new_name'}, axis = 'kolom') Melempar TypeError: Tidak dapat menentukan 'sumbu' dan salah satu dari 'indeks' atau 'kolom'.
,
@ Di sini Pastikan Anda menggunakan versi panda 0.21. Apakah pd.__version__untuk memeriksa versi Anda
Ted Petrou
5

Jika Anda tahu kolom # mana itu (pertama / kedua / ke-n) maka solusi ini yang diposting pada pertanyaan serupa berfungsi terlepas dari apakah namanya atau tidak disebutkan namanya, dan dalam satu baris: https://stackoverflow.com/a/26336314/ 4355695

df.rename(columns = {list(df)[1]:'new_name'}, inplace=True)
# 1 is for second column (0,1,2..)
Nikhil VJ
sumber
3

Untuk mengganti nama kolom di sini adalah yang sederhana yang akan bekerja untuk Default(0,1,2,etc;)kolom kedua dan yang sudah ada tetapi tidak banyak berguna untuk kumpulan data yang lebih besar (memiliki banyak kolom).

Untuk kumpulan data yang lebih besar kita dapat mengiris kolom yang kita butuhkan dan menerapkan kode di bawah ini:

df.columns = ['new_name','new_name1','old_name']
Naveen Reddy
sumber
2

Kode pendek berikut dapat membantu:

df3 = df3.rename(columns={c: c.replace(' ', '') for c in df3.columns})

Hapus spasi dari kolom.

Emmanuel Masabo
sumber
Saya terus berusaha, AttributeError: 'int' object has no attribute 'replace'bisakah Anda mengembangkannya.
Nirmal
2

panda versi 0.23.4

df.rename(index=str,columns={'old_name':'new_name'},inplace=True)

Untuk catatan:

menghilangkan indeks = str akan memberikan kesalahan ganti memiliki argumen 'kolom' yang tidak terduga

Kallol Medhi
sumber
1

Opsi lain adalah dengan cukup menyalin & menjatuhkan kolom:

df = pd.DataFrame(d)
df['new_name'] = df['two']
df = df.drop('two', axis=1)
df.head()

Setelah itu Anda mendapatkan hasilnya:

    one three   new_name
0   1   a       9
1   2   b       8
2   3   c       7
3   4   d       6
4   5   e       5
anka
sumber
2
Metode ini tidak akan membantu jika urutan indeks kolom penting. Kolom baru akan dibuat di akhir.
Loochie