Thay đổi tên cột cụ thể trong pandas DataFrame


195

Tôi đang tìm kiếm một cách thanh lịch để thay đổi tên cột được chỉ định trong a DataFrame.

chơi dữ liệu ...

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)

Giải pháp tao nhã nhất mà tôi đã tìm thấy cho đến nay ...

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

Tôi đã hy vọng cho một lớp lót đơn giản ... nỗ lực này đã thất bại ...

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

Bất kỳ gợi ý nhận được biết ơn.

Câu trả lời:


355

Một lớp lót tồn tại:

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

Sau đây là chuỗi doc cho renamephương thức.

Định nghĩa: df.rename (tự, chỉ mục = Không, cột = Không, sao chép = Đúng, inplace = Sai)
Dây đeo:
Thay đổi chỉ mục và / hoặc cột bằng chức năng nhập hoặc
chức năng. Các giá trị hàm / dict phải là duy nhất (1 trên 1). Nhãn không
chứa trong một dict / Series sẽ được giữ nguyên.

Thông số
----------
chỉ mục: giống như dict hoặc chức năng, tùy chọn
    Chuyển đổi để áp dụng cho các giá trị chỉ mục
cột: giống như dict hoặc chức năng, tùy chọn
    Chuyển đổi để áp dụng cho các giá trị cột
sao chép: boolean, mặc định Đúng
    Đồng thời sao chép dữ liệu cơ bản
inplace: boolean, mặc định Sai
    Có trả lại DataFrame mới hay không. Nếu đúng thì giá trị của bản sao là
    làm ngơ.

Xem thêm
--------
Series.rename

Trả về
-------
đã đổi tên: DataFrame (đối tượng mới)

Điều này không hiệu quả với tôi trừ khi tôi sử dụng inplace = True như trong câu trả lời @ Jeong-Yoon Lee.
JStrahl

108

inplaceđối số có sẵn, bạn không cần sao chép và gán khung dữ liệu gốc cho chính nó, nhưng thực hiện như sau:

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

39

Thế còn?

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

11
thực sự không hoạt động nếu sau này bạn sử dụng tên cột cho các hoạt động khác như trong df ['new_name']
Master Yogurt

4
câu trả lời này rất hữu ích cho tôi để thay đổi một cột cụ thể thành một tên mới. Cột 1 là chỉ số 0, cột thứ 2 là chỉ số 1, v.v. giải pháp tốt đẹp .. và tôi chắc chắn rằng điều này sẽ giúp nhiều người hơn .. vì các giải pháp khác yêu cầu bạn phải biết và sao chép tên cột ban đầu trước .... trong khi đây là phương pháp nhanh và bẩn .. có cách sử dụng riêng.
ihightower

1
@MasterYogurt bình luận của bạn không đúng. Có thể thực hiện df['new_name'](và những thứ gấu trúc khác) sau khi thay đổi các biến như đã nêu ở trên. Nhận xét của bạn có thể có giá trị khi nó được đăng ban đầu.
Jacob H

1
Điều đó đang được nói, sử dụng các renamephương pháp là một giải pháp tốt hơn.
Jacob H

6

Pandas 0.21 hiện có tham số trục

Phương thức đổi tên đã đạt được một tham số trục để khớp với hầu hết các phần còn lại của API gấu trúc.

Vì vậy, ngoài việc này:

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

Bạn có thể làm:

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

hoặc là

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

df.rename ({'hai': 'new_name'}, trục = 'cột') Ném LoạiError: Không thể chỉ định cả 'trục' và bất kỳ 'chỉ mục' hoặc 'cột' nào.
Ở đây

@HereHere Hãy chắc chắn rằng bạn đang ở trên phiên bản gấu trúc 0.21. Làm pd.__version__để kiểm tra phiên bản của bạn
Ted Petrou

5

Nếu bạn biết cột # đó là gì (đầu tiên / giây / nth) thì giải pháp này được đăng trên một câu hỏi tương tự hoạt động bất kể nó được đặt tên hay không được đặt tên và trong một dòng: 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

Để đổi tên các cột ở đây là một cột đơn giản sẽ hoạt động cho cả hai Default(0,1,2,etc;)cột hiện có nhưng không hữu ích cho các tập dữ liệu lớn hơn (có nhiều cột).

Đối với tập dữ liệu lớn hơn, chúng ta có thể cắt các cột mà chúng ta cần và áp dụng mã dưới đây:

df.columns = ['new_name','new_name1','old_name']

2

Theo mã ngắn có thể giúp:

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

Xóa khoảng trắng khỏi cột.


Tôi tiếp tục nhận được AttributeError: 'int' object has no attribute 'replace'bạn có thể mở rộng về điều đó.
Nirmal

2

phiên bản gấu trúc 0.23.4

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

Đối với hồ sơ:

bỏ qua index = str sẽ đưa ra lỗi thay thế có một 'cột' đối số không mong muốn


1

Một tùy chọn khác chỉ đơn giản là sao chép và thả cột:

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

Sau đó, bạn nhận được kết quả:

    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
Phương pháp này sẽ không giúp ích trong trường hợp thứ tự của các chỉ mục cột là quan trọng. Cột mới sẽ được tạo ở cuối.
Loochie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.