Làm cách nào để đổi tên một cột cụ thể trong gấu trúc?
Từ v0.24 +, để đổi tên một (hoặc nhiều) cột cùng một lúc,
Nếu bạn cần đổi tên TẤT CẢ các cột cùng một lúc,
DataFrame.set_axis()
phương pháp với axis=1
. Vượt qua một chuỗi giống như danh sách. Tùy chọn có sẵn để sửa đổi tại chỗ là tốt.
rename
với axis=1
df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df
y gdp cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Với 0,21+, giờ đây bạn có thể chỉ định một axis
tham số với rename
:
df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
(Lưu ý rằng rename
không phải tại chỗ theo mặc định, vì vậy bạn sẽ cần gán lại kết quả .)
Sự bổ sung này đã được thực hiện để cải thiện tính nhất quán với phần còn lại của API. Đối axis
số mới tương tự như columns
tham số, họ làm điều tương tự.
df.rename(columns={'gdp': 'log(gdp)'})
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
rename
cũng chấp nhận một cuộc gọi lại được gọi một lần cho mỗi cột.
df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')
y g c
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Đối với kịch bản cụ thể này, bạn sẽ muốn sử dụng
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Tương tự như replace
phương thức chuỗi trong python, pandas Index và Series (chỉ đối tượng dtype) xác định str.replace
phương thức ("vectorized") để thay thế dựa trên chuỗi và regex.
df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Ưu điểm của phương thức này so với các phương thức khác là str.replace
hỗ trợ regex (được bật theo mặc định). Xem tài liệu để biết thêm thông tin.
Vượt qua một danh sách set_axis
vớiaxis=1
Gọi set_axis
với một danh sách (các) tiêu đề. Danh sách phải có độ dài bằng với kích thước cột / chỉ mục. set_axis
thay đổi DataFrame gốc theo mặc định, nhưng bạn có thể chỉ định inplace=False
trả về một bản sao đã sửa đổi.
df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
cap log(gdp) y
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
Lưu ý: Trong các bản phát hành trong tương lai, inplace
sẽ mặc định là True
.
Chuỗi phương pháp
Tại sao chọn set_axis
khi chúng ta đã có cách gán cột hiệu quả df.columns = ...
? Như được hiển thị bởi Ted Petrou trong [câu trả lời này], ( https://stackoverflow.com/a/46912050/4909087 ) set_axis
rất hữu ích khi cố gắng xâu chuỗi các phương thức.
Đối chiếu
# new for pandas 0.21+
df.some_method1()
.some_method2()
.set_axis()
.some_method3()
Đấu với
# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
Các cựu là cú pháp chảy tự nhiên và tự do hơn.