Saya memiliki DataFrame menggunakan panda dan label kolom yang perlu saya edit untuk mengganti kolom label.
I'd suka untuk mengubah nama kolom dalam DataFrame A
mana yang asli nama kolom adalah:
['$a', '$b', '$c', '$d', '$e']
untuk
['a', 'b', 'c', 'd', 'e'].
Saya telah diedit kolom nama-nama yang tersimpan dalam daftar, tapi aku don't tahu bagaimana untuk mengganti nama kolom.
Gunakan df.rename()
fungsi dan lihat kolom yang akan diganti namanya. Tidak semua kolom harus diganti:
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)
Minimal Contoh Kode
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
Berikut metode semua pekerjaan 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
Ingat untuk menetapkan hasil kembali, sebagai modifikasi adalah tidak-inplace. Atau, tentukan 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 kesalahan='meningkatkan'
untuk menaikkan kesalahan jika kolom tidak valid-untuk-mengubah ditentukan. Lihat v0.25 rename()
docs.
Gunakan df.set_axis()
dengan axis=1
dan inplace=False
(untuk mengembalikan copy).
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
Hal ini mengembalikan salinan, tapi anda dapat memodifikasi DataFrame di-tempat dengan menetapkan inplace=True
(ini adalah perilaku default untuk versi <=0.24 tapi kemungkinan akan berubah di masa depan).
Anda juga dapat menetapkan header 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
The nama
metode 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)
Telah ada beberapa update yang signifikan untuk mengubah nama kolom dalam versi 0.21.
nama
method telah ditambahkan axis
parameter yang dapat diatur untuk kolom
atau 1
. Pembaruan ini membuat metode ini pertandingan sisa panda API. Ia masih memiliki index
dan kolom
parameter tetapi anda tidak lagi dipaksa untuk menggunakannya. set_axis
method dengan inplace
set Palsu
memungkinkan anda untuk mengubah semua indeks atau kolom label dengan klik disini.Membangun contoh 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
rename
dengan axis='kolom'
atau axis=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)
Kedua mengakibatkan hal-hal berikut:
a b c d e
0 1 3 5 7 9
1 2 4 6 8 10
Hal ini masih mungkin untuk menggunakan metode lama signature:
df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})
Tombol ubah nama
fungsi juga menerima fungsi yang akan diterapkan untuk masing-masing kolom nama.
df.rename(lambda x: x[1:], axis='columns')
atau
df.rename(lambda x: x[1:], axis=1)
set_axis
dengan daftar dan inplace=False
Anda dapat menyediakan daftar ke set_axis
metode yang sama panjang dengan jumlah kolom (atau indeks). Saat ini, inplace
default Benar
, tapi inplace
akan gagal untuk Palsu
di rilis di masa depan.
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)
df.kolom = ['a', 'b', 'c', 'd', 'e']
?Tidak ada yang salah dengan menetapkan kolom secara langsung seperti ini. Ini adalah sempurna solusi yang baik.
Keuntungan menggunakan set_axis
adalah bahwa hal itu dapat digunakan sebagai bagian dari metode rantai dan bahwa ia mengembalikan salinan baru dari DataFrame. Tanpa itu, anda akan memiliki untuk menyimpan langkah-langkah perantara rantai untuk variabel lain sebelum pemindahan 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()
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 secara manual mengedit new_names
seperti yang anda inginkan.
Karya besar ketika anda perlu untuk mengubah nama hanya beberapa kolom untuk memperbaiki mispellings, aksen, menghapus karakter khusus dll.
I'll fokus pada dua hal:
aku telah diedit kolom nama-nama yang tersimpan dalam daftar, tapi aku don't tahu bagaimana untuk mengganti nama kolom.
Saya tidak ingin untuk memecahkan masalah bagaimana cara mengganti'$'
atau strip karakter pertama dari setiap judul kolom. OP sudah melakukan langkah ini. Bukannya saya ingin fokus pada mengganti yang sudah ada kolom
objek dengan yang baru diberikan daftar penggantian nama kolom.
df.kolom = baru
di mana baru
ini daftar nama-nama kolom baru adalah sebagai sederhana karena mendapat. Kelemahan dari pendekatan ini adalah bahwa hal itu memerlukan editing yang ada dataframe's kolom
atribut dan isn't dilakukan inline. I'll menunjukkan beberapa cara untuk melakukan ini melalui pipelining tanpa editing yang ada dataframe.Setup 1
Untuk fokus pada kebutuhan untuk mengubah nama ganti nama kolom dengan pre-daftar yang ada, saya'll membuat sampel baru dataframe df
dengan awal nama-nama kolom yang baru dan tidak terkait nama-nama kolom.
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.ganti nama
Hal itu telah dikatakan sudah bahwa jika **** anda punya kamus pemetaan tua kolom nama baru untuk nama kolom, anda bisa 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 untuk mengubah
. Berikut ini mengambil keuntungan dari fakta bahwa ketika iterasi df
, kita iterate atas setiap kolom nama.
# 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 bekerja baik jika anda original kolom nama-nama yang unik. Tetapi jika mereka tidak, maka ini rusak.
Setup 2 non-kolom 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 kunci
argumen
Pertama, perhatikan apa yang terjadi ketika kita mencoba untuk menggunakan solusi 1:
df.rename(columns=dict(zip(df, new)))
y765 y765 z432
0 1 3 5
1 2 4 6
Kami didn't peta baru
daftar sebagai nama kolom. Akhirnya kami mengulangi y765
. Sebaliknya, kita dapat menggunakan kunci
argumen pd.concat
fungsi sementara iterasi 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
Larutan 3
Merekonstruksi. Ini hanya boleh digunakan jika anda memiliki single dtype
untuk semua kolom. Jika tidak, anda'll berakhir dengan dtype
objek
untuk semua kolom dan mengkonversi mereka kembali membutuhkan lebih banyak kamus pekerjaan.
Single 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 merefleksikan
dan set_index
. pd.DataFrame.set_index
memungkinkan kita untuk menetapkan indeks inline tapi tidak ada yang sesuai set_columns
. Jadi kita bisa transpose, maka set_index
, dan merefleksikan kembali. Namun, sama single dtype
terhadap campuran dtype
peringatan dari solusi 3 berlaku di sini.
Single 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
Menggunakan lambda
di pd.DataFrame.rename
yang masing-masing siklus melalui elemen baru
Dalam solusi ini, kami melewati sebuah lambda yang mengambil x
tetapi kemudian mengabaikan hal itu. Ini juga membutuhkan y
tapi doesn't mengharapkan itu. Sebaliknya, sebuah iterator diberikan sebagai nilai default dan saya kemudian dapat menggunakannya untuk siklus melalui satu pada satu waktu tanpa memperhatikan apa nilai x
ini.
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 sopython chat, jika saya menambahkan *
di antara x
dan y
, aku bisa melindungi saya, y
variabel. Meskipun, dalam konteks ini saya don't percaya itu perlu melindungi. Itu masih layak disebut.
df.rename(columns=lambda x, *, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6
Saya ingin menjelaskan sedikit apa yang terjadi di balik layar.
Dataframes adalah rangkaian Seri.
Seri pada gilirannya merupakan perpanjangan dari numpy.array
numpy.hotel ini memiliki sebuah properti
.nama`
Ini adalah nama seri. Hal ini jarang bahwa panda hal ini atribut, tapi itu tetap hidup di tempat-tempat dan dapat digunakan untuk hack beberapa panda perilaku.
Banyak jawaban di sini berbicara tentang df.kolom
atribut menjadi daftar
ketika pada kenyataannya itu adalah Seri
. Ini berarti memiliki .nama
atribut.
Ini adalah apa yang terjadi jika anda memutuskan untuk mengisi nama kolom Seri
:
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 index selalu datang satu kolom yang lebih rendah.
The .nama
atribut yang menempel pada kadang-kadang. Jika anda mengatur df.kolom = ['satu', 'dua']
maka df.satu.nama
akan menjadi 'satu'
.
Jika anda mengatur df.satu.name = 'tiga'
kemudian df.kolom
masih akan memberikan anda ['satu', 'dua']
, dan df.satu.nama
akan memberikan anda 'tiga'
pd.DataFrame(df.satu)
akan kembali
three
0 1
1 2
2 3
Karena panda reuses .nama
sudah didefinisikan Seri
.
Panda memiliki cara-cara melakukan multi-layered nama kolom. Tidak ada begitu banyak keajaiban yang terlibat, tetapi saya ingin membahas hal ini dalam jawaban saya juga karena aku don't melihat orang mengambil ini di sini.
|one |
|one |two |
0 | 4 | 1 |
1 | 5 | 2 |
2 | 6 | 3 |
Ini adalah mudah dicapai oleh pengaturan kolom untuk daftar, seperti ini:
df.columns = [['one', 'one'], ['one', 'two']]
df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})
Jika anda baru daftar kolom dalam urutan yang sama seperti kolom yang ada, tugas 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 anda memiliki kamus mengetik di kolom nama-nama baru untuk nama kolom, 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 don't memiliki daftar atau kamus pemetaan, anda bisa strip terkemuka $
simbol melalui daftar pemahaman:
df.columns = [col[1:] if col[0] == '$' else col for col in df]
Jika anda've got dataframe, df.kolom membuang semuanya ke dalam daftar anda dapat memanipulasi dan kemudian menetapkan kembali ke dataframe sebagai 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 dikemukakan dalam jawaban untuk pertanyaan ini di bawah ini menggunakan cProfile untuk gage memori & waktu pelaksanaan. @kadee, @kaitlyn, & @eumiro memiliki fungsi dengan eksekusi tercepat kali - meskipun fungsi-fungsi ini begitu cepat kita're membandingkan pembulatan .000 dan .001 detik untuk semua jawaban. Moral: jawaban saya di atas mungkin isn't 'Terbaik' cara.
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)')
df.rename(index=str,columns={'A':'a','B':'b'})
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
Cara lain kita bisa mengganti kolom label dengan pengupasan karakter yang tidak diinginkan (di sini '$') asli dari kolom label.
Ini bisa dilakukan dengan menjalankan untuk loop melalui df.kolom dan menambahkan dilucuti kolom ke df.kolom.
Sebaliknya , kita dapat melakukan ini dengan rapi dalam sebuah pernyataan tunggal dengan menggunakan daftar pemahaman seperti di bawah ini:
df.columns = [col.strip('$') for col in df.columns]
(strip
metode dalam Python strip karakter yang diberikan dari awal dan akhir string.)
Saya tahu ini pertanyaan dan jawaban yang telah dikunyah sampai mati. Tapi saya sebut ini sebagai inspirasi untuk salah satu masalah yang saya alami . Saya mampu untuk mengatasinya dengan menggunakan potongan-potongan dari jawaban yang berbeda sehingga memberikan tanggapan saya dalam kasus ada yang membutuhkan itu.
Metode saya adalah generic dimana anda dapat menambahkan tambahan pembatas dengan tanda koma memisahkan pembatas=
variabel dan masa depan-bukti 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 ]
Output:
>>> 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
Perhatikan bahwa pendekatan ini tidak bekerja 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
Let's mengatakan ini adalah anda dataframe.
Anda dapat mengubah nama kolom menggunakan dua metode.
dataframe.kolom=[#klik disini]
df.kolom=['a','b','c','d','e']
Keterbatasan dari metode ini adalah bahwa jika salah satu kolom yang akan diubah, penuh daftar kolom harus diteruskan. Juga, metode ini tidak berlaku pada indeks label. Misalnya, jika anda melewati ini:
df.kolom = ['a','b','c','d']
Ini akan melempar kesalahan. Panjang mismatch: Diharapkan axis memiliki 5 unsur, nilai-nilai baru memiliki 4 elemen.
rename()
metode yang digunakan untuk mengubah setiap indeks, kolom atau barisdf = df.ganti nama(kolom={'$a':'a'})
Demikian pula, anda dapat mengubah setiap baris atau kolom.