Mengganti nama kolom dalam panda


1827

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


1
Anda mungkin ingin memeriksa dokumen resmi yang mencakup penggantian nama label kolom: pandas.pydata.org/pandas-docs/stable/user_guide/text.html
ccpizza

Jawaban:


1829

Cukup tetapkan ke .columnsatribut:

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

303
Apakah mungkin untuk mengubah nama tajuk kolom tunggal?
ericmjl

112
@ ericmjl: misalkan Anda ingin mengubah nama variabel pertama df. Maka Anda dapat melakukan sesuatu seperti:new_columns = df.columns.values; new_columns[0] = 'XX'; df.columns = new_columns
cd98

54
Sepertinya Anda bisa menyelesaikan df.columns.values ​​[0] = 'XX'
RAY

25
Hanya bercanda, @RAY - jangan lakukan itu. Sepertinya itu daftar yang dibuat independen dari pengindeksan apa pun yang menyimpan nama kolom. Melakukan pekerjaan yang bagus menghancurkan penamaan kolom untuk df Anda ...
Mitch Flax

433
@ ericmjl yadf.rename(columns = {'$b':'B'}, inplace = True)
nachocab

2848

RENAME COLUMNS SPESIFIK

Gunakan df.rename()fungsi dan rujuk kolom yang akan diganti namanya. Tidak semua kolom harus diganti namanya:

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

Contoh Kode Minimal

df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df

   a  b  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

Metode berikut semuanya bekerja dan menghasilkan output yang sama:

df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1)  # new method
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'})  # old method  

df2

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

Ingatlah untuk mengembalikan hasilnya, karena modifikasi tidak ada di tempat. Atau, sebutkan inplace=True:

df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

Dari v0.25, Anda juga dapat menentukan errors='raise'untuk meningkatkan kesalahan jika kolom-untuk-mengganti nama tidak valid ditentukan. Lihat v0.25 rename()docs .


REASSIGN COLUMN HEADERS

Gunakan df.set_axis()dengan axis=1dan inplace=False(untuk mengembalikan salinan).

df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1, inplace=False)
df2

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

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:

df.columns = ['V', 'W', 'X', 'Y', 'Z']
df

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

2
ketika saya melakukan ini dengan bingkai data 6 kolom (dataframe <tekan enter>) representasi singkat: code<class 'pandas.core.frame.DataFrame'> Int64Index: 1000 entri, 0 hingga 999 Kolom data: BodyMarkdown 1000 codekarya bukan nol , tetapi ketika saya melakukan dataframe.head () nama-nama lama untuk kolom muncul kembali.
darKoram

12
Saya mendapatkan ketakutan SettingWithCopyWarning:ketika saya menggunakan potongan kode kedua dalam jawaban ini.
Monica Heddneck

apakah ada versi ini dengan penggantian regex?
denfromufa

@lexual Bagaimana jika dua kolom yang ada memiliki nama yang sama? Bagaimana saya merujuk pada nama kolom yang lama?
vagabond

14
Solusi pertama: 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. Hal inplace=Trueini diperlukan untuk menghindari gotchya itu.
irritable_phd_syndrom

402

The renameMetode dapat mengambil fungsi , misalnya:

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

56
Bagus. Yang ini menyelamatkan hari saya:df.rename(columns=lambda x: x.lstrip(), inplace=True)
root-11

2
Mirip dengan @ root-11 - dalam kasus saya ada karakter bullet point yang tidak dicetak dalam output konsol IPython, jadi saya harus menghapus lebih dari sekadar spasi putih (stripe), jadi:t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
The Red Pea

9
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)adalah permata sehingga kita bisa menulis df.Column_1_Namedaripada menulis df.loc[:, 'Column 1 Name'].
Little Bobby Tables


164

Panda 0,21+ Jawab

Ada beberapa pembaruan signifikan untuk penggantian nama kolom di versi 0.21.

  • The renameMetode telah menambahkan axisparameter yang dapat diatur ke columnsatau 1. Pembaruan ini membuat metode ini cocok dengan API panda lainnya. Masih memiliki indexdan columnsparameter tetapi Anda tidak lagi dipaksa untuk menggunakannya.
  • The set_axisMetode dengan inplaceset untuk Falsememungkinkan Anda untuk mengubah nama semua indeks atau kolom label dengan daftar.

Contoh untuk Pandas 0.21+

Buat sampel DataFrame:

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

Menggunakan renamedengan axis='columns'atauaxis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

atau

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

Keduanya menghasilkan sebagai berikut:

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

Masih mungkin menggunakan tanda tangan metode lama:

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

The renameFungsi juga menerima fungsi yang akan diterapkan untuk setiap nama kolom.

df.rename(lambda x: x[1:], axis='columns')

atau

df.rename(lambda x: x[1:], axis=1)

Menggunakan set_axisdengan daftar daninplace=False

Anda dapat menyediakan daftar ke set_axismetode yang panjangnya sama dengan jumlah kolom (atau indeks). Saat ini, inplacedefault untuk True, tetapi inplaceakan default Falsepada rilis mendatang.

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

atau

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

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

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

1
Terima kasih atas Pandas 0.21+ answer- entah bagaimana saya melewatkan bagian itu di bagian "apa yang baru" ...
MaxU

1
Solusinya tampaknya tidak bekerja untuk Pandas 3.6: df.rename ({'$ a': 'a', '$ b': 'b', '$ c': 'c', '$ d': 'd ',' $ e ':' e '}, sumbu =' kolom '). Mendapat argumen kata kunci "sumbu" yang tidak terduga
Arthur D. Howland

3
df.columns = ['a', 'b', 'c', 'd', 'e'] tampaknya tidak berfungsi lagi, bekerja dengan versi 0.22 Saya memiliki peringatan yang mengatakan bahwa Pandas tidak mengizinkan kolom dibuat melalui nama atribut baru . cara mengganti nama jika semua kolom saya disebut sama: /
Nabla

Apakah ada cara untuk mengganti nama satu, banyak atau semua kolom, jika Anda tidak tahu nama kolom sebelumnya tetapi hanya indeksnya? Terima kasih!
tommy.carstensen

ini adalah komentar yang sangat membantu. misalnya, fungsi lambda menjawab pertanyaan saya tentang bagaimana melakukan hal berikut:(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
Measallthethings

131

Karena Anda hanya ingin menghapus $ sign di semua nama kolom, Anda bisa melakukan:

df = df.rename(columns=lambda x: x.replace('$', ''))

ATAU

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

1
Yang ini tidak hanya membantu dalam kasus OP tetapi juga dalam persyaratan umum. Misalnya: untuk membagi nama kolom dengan pemisah dan menggunakan salah satu bagiannya.
Deepak


61
old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

Dengan cara ini Anda dapat mengedit secara manual new_namessesuai keinginan. Bekerja dengan baik ketika Anda perlu mengganti nama hanya beberapa kolom untuk memperbaiki kesalahan ejaan, aksen, menghapus karakter khusus dll.


1
Saya suka pendekatan ini, tetapi saya pikir df.columns = ['a', 'b', 'c', 'd', 'e']lebih sederhana.
Christopher Pearson

1
Saya suka metode zip nama lama dan baru. Kita bisa menggunakan df.columns.valuesuntuk mendapatkan nama-nama lama.
bkowshik

1
Saya menampilkan tampilan tabular dan menyalin kolom ke old_names. Saya menyalin array persyaratan ke new_names. Kemudian gunakan dict (zip (old_names, new_names)) solusi yang sangat elegan.
mitos pembuat

Saya sering menggunakan himpunan bagian dari sesuatu seperti myList = list(df) myList[10:20]:, dll - jadi ini sempurna.
Tim Gottgetreu

Yang terbaik untuk mengambil nama lama seperti yang disarankan oleh @bkowshik, lalu edit dan masukkan kembali, yaitu namez = df.columns.valuesdiikuti dengan beberapa pengeditan, kemudian df.columns = namez.
pauljohn32

34

Satu jalur atau solusi Pipeline

Saya akan fokus pada dua hal:

  1. OP dengan jelas menyatakan

    Saya memiliki nama kolom yang diedit menyimpannya dalam daftar, tetapi saya tidak tahu bagaimana cara mengganti nama kolom.

    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 mengganti columnsobjek yang ada dengan yang baru diberi daftar nama kolom pengganti.

  2. df.columns = newdi mana newdaftar nama kolom baru sesederhana yang didapatnya. Kekurangan dari pendekatan ini adalah bahwa itu memerlukan pengeditan columnsatribut 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 dfdengan nama kolom awal dan nama kolom baru yang tidak terkait.

df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']

df

   Jack  Mahesh  Xin
0     1       3    5
1     2       4    6

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.

d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)

   x098  y765  z432
0     1     3     5
1     2     4     6

Namun, Anda dapat dengan mudah membuat kamus itu dan memasukkannya ke dalam panggilan ke rename. Berikut ini mengambil keuntungan dari fakta bahwa ketika mengulangi df, kami mengulangi setiap nama kolom.

# given just a list of new column names
df.rename(columns=dict(zip(df, new)))

   x098  y765  z432
0     1     3     5
1     2     4     6

Ini berfungsi baik jika nama kolom asli Anda unik. Tetapi jika tidak, maka ini rusak.


Setup 2
kolom non-unik

df = pd.DataFrame(
    [[1, 3, 5], [2, 4, 6]],
    columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']

df

   Mahesh  Mahesh  Xin
0       1       3    5
1       2       4    6

Solusi 2
pd.concat menggunakan keysargumen

Pertama, perhatikan apa yang terjadi ketika kami mencoba menggunakan solusi 1:

df.rename(columns=dict(zip(df, new)))

   y765  y765  z432
0     1     3     5
1     2     4     6

Kami tidak memetakan newdaftar sebagai nama kolom. Kami akhirnya mengulangi y765. Sebagai gantinya, kita bisa menggunakan keysargumen pd.concatfungsi sambil mengulangi melalui kolom df.

pd.concat([c for _, c in df.items()], axis=1, keys=new) 

   x098  y765  z432
0     1     3     5
1     2     4     6

Solusi 3
Rekonstruksi. Ini seharusnya hanya digunakan jika Anda memiliki satu dtypeuntuk semua kolom. Jika tidak, Anda akan mendapatkan dtype objectsemua kolom dan mengonversinya kembali memerlukan lebih banyak pekerjaan kamus.

Tunggal dtype

pd.DataFrame(df.values, df.index, new)

   x098  y765  z432
0     1     3     5
1     2     4     6

Campuran dtype

pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

Solusi 4
Ini adalah trik menarik perhatian dengan transposedan set_index. pd.DataFrame.set_indexmemungkinkan kita untuk mengatur inline indeks tetapi tidak ada yang sesuai set_columns. Jadi kita bisa memindahkan, lalu set_index, dan memindahkan kembali. Namun, peringatan tunggal dtypeversus campuran yang sama dtypedari solusi 3 berlaku di sini.

Tunggal dtype

df.T.set_index(np.asarray(new)).T

   x098  y765  z432
0     1     3     5
1     2     4     6

Campuran dtype

df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

Solusi 5
Gunakan a lambdadalam pd.DataFrame.renamesiklus itu melalui setiap elemen new
Dalam solusi ini, kami melewati lambda yang mengambil xtetapi kemudian mengabaikannya. Ini juga membutuhkan ytetapi tidak mengharapkannya. Sebagai gantinya, sebuah iterator diberikan sebagai nilai default dan saya kemudian dapat menggunakannya untuk menggilir satu per satu tanpa memperhatikan apa nilainya x.

df.rename(columns=lambda x, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

Dan seperti yang ditunjukkan kepada saya oleh orang-orang di obrolan sopython , jika saya menambahkan *di antaranya xdan y, saya dapat melindungi yvariabel saya . Padahal, dalam konteks ini saya tidak percaya itu perlu dilindungi. Masih layak disebut.

df.rename(columns=lambda x, *, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

Mungkin kita bisa menambahkandf.rename(lambda x : x.lstrip('$'),axis=1)
YOBEN_S

Hai @piRSquared, apakah Anda dapat menguraikan bagaimana panda menggunakan fungsi lambda di Solusi 5? Saya tidak cukup mengikuti apa yang Anda maksud ketika Anda mengatakan xdiabaikan?
Josmoor98

33

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.arrayMemiliki 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.columnsatribut menjadi listketika sebenarnya itu adalah Series. Ini berarti ia memiliki .nameatribut.

Inilah yang terjadi jika Anda memutuskan untuk mengisi nama kolom Series:

df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']

name of the list of columns     column_one  column_two
name of the index       
0                                    4           1
1                                    5           2
2                                    6           3

Perhatikan bahwa nama indeks selalu lebih rendah satu kolom.

Artefak yang tertinggal

The .nameAtribut tetap hidup di kadang-kadang. Jika Anda mengatur df.columns = ['one', 'two']maka df.one.nameakan menjadi 'one'.

Jika Anda mengatur df.one.name = 'three'maka df.columnsakan tetap memberi Anda ['one', 'two'], dan df.one.nameakan memberi Anda'three'

TAPI

pd.DataFrame(df.one) akan kembali

    three
0       1
1       2
2       3

Karena panda menggunakan kembali .namedari yang sudah didefinisikan Series.

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.

    |one            |
    |one      |two  |
0   |  4      |  1  |
1   |  5      |  2  |
2   |  6      |  3  |

Ini mudah dicapai dengan mengatur kolom ke daftar, seperti ini:

df.columns = [['one', 'one'], ['one', 'two']]

18

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

columns = df.columns
columns = [row.replace("$","") for row in columns]
df.rename(columns=dict(zip(columns, things)), inplace=True)
df.head() #to validate the output

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

import pandas as pd
import cProfile, pstats, re

old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
col_dict = {'$a': 'a', '$b': 'b','$c':'c','$d':'d','$e':'e'}

df = pd.DataFrame({'$a':[1,2], '$b': [10,20],'$c':['bleep','blorp'],'$d':[1,2],'$e':['texa$','']})

df.head()

def eumiro(df,nn):
    df.columns = nn
    #This direct renaming approach is duplicated in methodology in several other answers: 
    return df

def lexual1(df):
    return df.rename(columns=col_dict)

def lexual2(df,col_dict):
    return df.rename(columns=col_dict, inplace=True)

def Panda_Master_Hayden(df):
    return df.rename(columns=lambda x: x[1:], inplace=True)

def paulo1(df):
    return df.rename(columns=lambda x: x.replace('$', ''))

def paulo2(df):
    return df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

def migloo(df,on,nn):
    return df.rename(columns=dict(zip(on, nn)), inplace=True)

def kadee(df):
    return df.columns.str.replace('$','')

def awo(df):
    columns = df.columns
    columns = [row.replace("$","") for row in columns]
    return df.rename(columns=dict(zip(columns, '')), inplace=True)

def kaitlyn(df):
    df.columns = [col.strip('$') for col in df.columns]
    return df

print 'eumiro'
cProfile.run('eumiro(df,new_names)')
print 'lexual1'
cProfile.run('lexual1(df)')
print 'lexual2'
cProfile.run('lexual2(df,col_dict)')
print 'andy hayden'
cProfile.run('Panda_Master_Hayden(df)')
print 'paulo1'
cProfile.run('paulo1(df)')
print 'paulo2'
cProfile.run('paulo2(df)')
print 'migloo'
cProfile.run('migloo(df,old_names,new_names)')
print 'kadee'
cProfile.run('kadee(df)')
print 'awo'
cProfile.run('awo(df)')
print 'kaitlyn'
cProfile.run('kaitlyn(df)')

Mengapa Anda perlu mengganti nama metode? Sesuatu seperti ini berhasil bagi saya # df.columns = [row.replace ('$', '') untuk baris di df.columns]
shantanuo

Saya tidak mengerti bagian 'hal-hal'. Apa yang harus saya ganti? Kolom lama?
Andrea Ianni ௫

18

Katakanlah ini adalah kerangka data Anda.

masukkan deskripsi gambar di sini

Anda dapat mengubah nama kolom menggunakan dua metode.

  1. Menggunakan dataframe.columns=[#list]

    df.columns=['a','b','c','d','e']

    masukkan deskripsi gambar di sini

    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:

    df.columns = ['a','b','c','d']

    Ini akan menimbulkan kesalahan. Panjang ketidakcocokan: Sumbu yang diharapkan memiliki 5 elemen, nilai baru memiliki 4 elemen.

  2. Metode lain adalah metode Pandas rename()yang digunakan untuk mengganti nama indeks, kolom atau baris

    df = df.rename(columns={'$a':'a'})

    masukkan deskripsi gambar di sini

Demikian pula, Anda dapat mengubah baris atau kolom apa pun.


17
df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})

Jika daftar kolom baru Anda berada dalam urutan yang sama dengan kolom yang ada, tugasnya sederhana:

new_cols = ['a', 'b', 'c', 'd', 'e']
df.columns = new_cols
>>> df
   a  b  c  d  e
0  1  1  1  1  1

Jika kamus Anda dikunci pada nama kolom lama ke nama kolom baru, Anda bisa melakukan hal berikut:

d = {'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}
df.columns = df.columns.map(lambda col: d[col])  # Or `.map(d.get)` as pointed out by @PiRSquared.
>>> df
   a  b  c  d  e
0  1  1  1  1  1

Jika Anda tidak memiliki pemetaan daftar atau kamus, Anda bisa menghapus $simbol utama melalui pemahaman daftar:

df.columns = [col[1:] if col[0] == '$' else col for col in df]

2
Alih-alih lambda col: d[col]Anda bisa lulus d.get... sehingga akan terlihat sepertidf.columns.map(d.get)
piRSquared


15

Mari Memahami penggantian nama dengan contoh kecil ...

1.Renaming kolom menggunakan pemetaan:

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) #creating a df with column name A and B
df.rename({"A": "new_a", "B": "new_b"},axis='columns',inplace =True) #renaming column A with 'new_a' and B with 'new_b'

output:
   new_a  new_b
0  1       4
1  2       5
2  3       6

2.Renaming indeks / Row_Name menggunakan pemetaan:

df.rename({0: "x", 1: "y", 2: "z"},axis='index',inplace =True) #Row name are getting replaced by 'x','y','z'.

output:
       new_a  new_b
    x  1       4
    y  2       5
    z  3       6

Jawaban yang paling dijunjung tinggi sudah memiliki contoh-contoh seperti ...
Itamar Mushkin

14

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:

df.columns = [col.strip('$') for col in df.columns]

( stripmetode dalam Python menghapus karakter yang diberikan dari awal dan akhir string.)


2
Bisakah Anda menjelaskan bagaimana / mengapa ini bekerja? Itu akan membuat jawaban lebih berharga bagi pembaca masa depan.
Dan Lowe

12

Sangat sederhana, gunakan saja

df.columns = ['Name1', 'Name2', 'Name3'...]

dan itu akan menetapkan nama kolom dengan urutan yang Anda masukkan


10

Anda bisa menggunakannya str.sliceuntuk itu:

df.columns = df.columns.str.slice(1)

1
PS: Ini lebih setara dengan df.columns.str[1:]... mungkin lebih baik menggunakan itu, lebih pendek dan lebih jelas.
cs95

9

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:

import pandas as pd
import re


df = pd.DataFrame({'$a':[1,2], '$b': [3,4],'$c':[5,6], '$d': [7,8], '$e': [9,10]})

delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]

Keluaran:

>>> df
   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

>>> df
   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

8

Perhatikan bahwa pendekatan ini tidak berfungsi untuk MultiIndex. Untuk MultiIndex, Anda perlu melakukan sesuatu seperti berikut:

>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
   $a $b  e
   $x $y  f
0  1  3  5
1  2  4  6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
        rename.get(item, item) for item in df.columns.tolist()])
>>> df
   a  b  e
   x  y  f
0  1  3  5
1  2  4  6

8

Pilihan lain adalah mengganti nama menggunakan ekspresi reguler:

import pandas as pd
import re

df = pd.DataFrame({'$a':[1,2], '$b':[3,4], '$c':[5,6]})

df = df.rename(columns=lambda x: re.sub('\$','',x))
>>> df
   a  b  c
0  1  3  5
1  2  4  6

6

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.

dict=dict(zip(df.columns,df.columns.str.replace('(:S$|:C1$|:L$|:D$|\.Serial:L$)','')))
dict['brand_timeseries:C1']='BTS'
dict['respid:L']='RespID'
dict['country:C1']='CountryID'
dict['pim1:D']='pim_actual'
df.rename(columns=dict, inplace=True)

5

Selain solusi yang sudah disediakan, Anda dapat mengganti semua kolom saat Anda membaca file. Kita dapat menggunakan namesdan header=0melakukan itu.

Pertama, kami membuat daftar nama yang ingin kami gunakan sebagai nama kolom kami:

import pandas as pd

ufo_cols = ['city', 'color reported', 'shape reported', 'state', 'time']
ufo.columns = ufo_cols

ufo = pd.read_csv('link to the file you are using', names = ufo_cols, header = 0)

Dalam hal ini, semua nama kolom akan diganti dengan nama yang ada di daftar Anda.


4

Inilah fungsi kecil yang bagus yang saya suka gunakan untuk mengurangi pengetikan:

def rename(data, oldnames, newname): 
    if type(oldnames) == str: #input can be a string or list of strings 
        oldnames = [oldnames] #when renaming multiple columns 
        newname = [newname] #make sure you pass the corresponding list of new names
    i = 0 
    for name in oldnames:
        oldvar = [c for c in data.columns if name in c]
        if len(oldvar) == 0: 
            raise ValueError("Sorry, couldn't find that column in the dataset")
        if len(oldvar) > 1: #doesn't have to be an exact match 
            print("Found multiple columns that matched " + str(name) + " :")
            for c in oldvar:
                print(str(oldvar.index(c)) + ": " + str(c))
            ind = input('please enter the index of the column you would like to rename: ')
            oldvar = oldvar[int(ind)]
        if len(oldvar) == 1:
            oldvar = oldvar[0]
        data = data.rename(columns = {oldvar : newname[i]})
        i += 1 
    return data   

Berikut ini contoh cara kerjanya:

In [2]: df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=['col1','col2','omg','idk'])
#first list = existing variables
#second list = new names for those variables
In [3]: df = rename(df, ['col','omg'],['first','ohmy']) 
Found multiple columns that matched col :
0: col1
1: col2

please enter the index of the column you would like to rename: 0

In [4]: df.columns
Out[5]: Index(['first', 'col2', 'ohmy', 'idk'], dtype='object')

1
Kasus penggunaan untuk fungsi seperti ini sangat jarang. Dalam kebanyakan kasus, saya tahu apa yang saya cari dan ingin saya ganti namanya, saya hanya menetapkan / memodifikasinya sendiri.
cs95

1
@ cs95 Saya cenderung bekerja dengan survei besar nasional atau internasional di mana variabel akan memiliki kode nama variabel yang dimulai dengan awalan tergantung pada opsi jawaban, skala likert, dan percabangan (seperti EDU_2913.443, EDU_2913.421, ...). Fungsi ini sangat berguna bagi saya dalam bekerja dengan tipe set tersebut, saya mengerti jika ini bukan untuk Anda :)
seeiespi

4

Mengganti nama kolom dalam panda adalah tugas yang mudah.

df.rename(columns = {'$a':'a','$b':'b','$c':'c','$d':'d','$e':'e'},inplace = True)

2

Dengan asumsi Anda dapat menggunakan ekspresi reguler. Solusi ini menghilangkan kebutuhan encoding manual menggunakan regex

import pandas as pd
import re

srch=re.compile(r"\w+")

data=pd.read_csv("CSV_FILE.csv")
cols=data.columns
new_cols=list(map(lambda v:v.group(),(list(map(srch.search,cols)))))
data.columns=new_cols

2
Ini praktik yang baik pada Stack Overflow untuk menambahkan penjelasan mengapa solusi Anda harus bekerja atau lebih baik daripada solusi yang ada. Untuk informasi lebih lanjut baca Cara Menjawab .
Samuel Liew

Perhatikan bagaimana jawaban dengan peringkat terbaik memerlukan beberapa bentuk pengkodean keras dan jawaban dengan peringkat terburuk hanya membutuhkan pendekatan deskriptif dan prosedural?
Kaustubh J

Ada solusi yang lebih baik (lebih mudah dibaca) yang juga menggunakan regex daripada ini. Ini melakukan jauh lebih banyak dari yang seharusnya untuk operasi penggantian nama sederhana. Ada juga bahaya dari pola tidak cocok dengan apa pun dalam hal ini Anda tidak melakukan apa pun untuk menangani kesalahan.
cs95
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.