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.

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)

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)

39

Bagaimana dengan?

df.columns.values[2] = "new_name"

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

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

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

2

Kode pendek berikut dapat membantu:

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

Hapus spasi dari kolom.


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


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

2
Metode ini tidak akan membantu jika urutan indeks kolom penting. Kolom baru akan dibuat di akhir.
Loochie
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.