Câu hỏi Đổi tên cột trong gấu trúc


Tôi có một DataFrame sử dụng các nhãn gấu trúc và cột mà tôi cần chỉnh sửa để thay thế các nhãn cột ban đầu.

Tôi muốn thay đổi tên cột trong DataFrame A nơi các tên cột ban đầu là:

['$a', '$b', '$c', '$d', '$e'] 

đến

['a', 'b', 'c', 'd', 'e'].

Tôi có tên cột đã chỉnh sửa được lưu trữ trong danh sách, nhưng tôi không biết cách thay thế tên cột.


1089
2017-07-05 14:21


gốc


Đối với những người đến với câu trả lời này trong năm 2017+. Pandas hiện đang ở phiên bản 0.21 và đã cập nhật một số phương pháp để đổi tên cột. Xem câu trả lời dưới đây: stackoverflow.com/a/46912050/3707607 - Ted Petrou
Đối với những người đến với câu trả lời này vào năm 2018+. Pandas hiện đang ở phiên bản 0.22 và vẫn chỉ thêm chức năng cho .rename phương pháp không liên quan đến câu hỏi này. Tất cả các câu trả lời dưới đây vẫn còn hiệu lực như trước. - firelynx


Các câu trả lời:


Chỉ cần gán nó cho .columns thuộc tính:

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

1129
2017-07-05 14:23



Có thể thay đổi tên tiêu đề cột đơn không? - ericmjl
@ericmjl: giả sử bạn muốn thay đổi tên biến đầu tiên của df. Sau đó, bạn có thể làm một cái gì đó như: new_columns = df.columns.values;   new_columns[0] = 'XX';  df.columns = new_columns - cd98
Có vẻ như bạn có thể chỉ cần thực hiện df.columns.values ​​[0] = 'XX' - RAY
Chỉ đùa thôi, @RAY - đừng làm thế. Có vẻ như đó là danh sách được tạo độc lập với bất kỳ việc lập chỉ mục nào lưu trữ tên cột. Có một công việc tốt đẹp phá hủy đặt tên cột cho df của bạn ... - Mitch Flax
@ericmjl yes df.rename(columns = {'$b':'B'}, inplace = True) - nachocab


Sử dụng df.rename() và tham khảo các cột được đổi tên. Không phải tất cả các cột phải được đổi tên:

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)

1871
2017-07-06 01:48



khi tôi làm điều này với một khung dữ liệu 6 cột (dataframe <nhấn enter>) biểu diễn viết tắt:code <class 'pandas.core.frame.DataFrame'> Int64Index: 1000 mục, 0 đến 999 Cột dữ liệu: BodyMarkdown 1000 không trống code hoạt động, nhưng khi tôi làm dataframe.head () tên cũ cho các cột xuất hiện lại. - darKoram
Tôi cảm thấy sợ hãi SettingWithCopyWarning: khi tôi sử dụng đoạn mã thứ hai trong câu trả lời này. - Monica Heddneck
là có một phiên bản này với thay thế regex? - denfromufa
oh, tôi đã tìm thấy nó - câu trả lời tiếp theo bên dưới! stackoverflow.com/a/16667215/2230844 - denfromufa
Giải pháp đầu tiên: df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}) thay đổi tên được hiển thị, nhưng không phải các phần tử trong cấu trúc dữ liệu cơ bản. Vì vậy, nếu bạn cố gắng df['newName1'] bạn sẽ gặp lỗi. Các inplace=True là cần thiết để tránh gotchya đó. - irritable_phd_syndrom


Các rename phương pháp có thể có một chức năng, ví dụ:

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)

295
2018-05-21 09:58



Tốt đẹp. Điều này đã cứu ngày của tôi: df.rename(columns=lambda x: x.lstrip(), inplace=True) - root-11
Tương tự như @ root-11 - trong trường hợp của tôi có một ký tự dấu đầu dòng không được in trong đầu ra giao diện điều khiển IPython, vì vậy tôi cần phải loại bỏ nhiều hơn chỉ khoảng trắng (sọc), vì vậy: t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','') - The Red Pea
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True) là một viên ngọc để chúng ta có thể viết df.Column_1_Name thay vì viếtdf.loc[:, 'Column 1 Name'] . - josh


Như được ghi trong http://pandas.pydata.org/pandas-docs/stable/text.html:

df.columns = df.columns.str.replace('$','')

121
2018-05-30 13:24





Vì bạn chỉ muốn xóa $ sign in tất cả các tên cột, bạn có thể thực hiện:

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

HOẶC LÀ

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

116
2018-03-26 10:20





Pandas 0.21+ Câu trả lời

Đã có một số cập nhật quan trọng đối với đổi tên cột trong phiên bản 0.21.

  • Các rename phương pháp đã thêm axis thông số có thể được đặt thành columns hoặc là 1. Bản cập nhật này làm cho phương thức này khớp với phần còn lại của API gấu trúc. Nó vẫn có index và columns các thông số nhưng bạn không còn bị buộc phải sử dụng chúng nữa.
  • Các set_axis phương pháp với inplace đặt thành False cho phép bạn đổi tên tất cả các nhãn chỉ mục hoặc cột với một danh sách.

Ví dụ về Pandas 0.21+

Tạo DataFrame mẫu:

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

Sử dụng rename với axis='columns' hoặc là axis=1

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

hoặc là

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

Cả hai kết quả như sau:

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

Vẫn có thể sử dụng chữ ký phương thức cũ:

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

Các rename hàm cũng chấp nhận các hàm sẽ được áp dụng cho mỗi tên cột.

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

hoặc là

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

Sử dụng set_axis với một danh sách và inplace=False

Bạn có thể cung cấp danh sách cho set_axis phương pháp có độ dài bằng nhau với số cột (hoặc chỉ mục). Hiện tại, inplace mặc định là True, nhưng inplace sẽ được mặc định thành False trong các bản phát hành trong tương lai.

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

hoặc là

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

Tại sao không sử dụng df.columns = ['a', 'b', 'c', 'd', 'e']?

Không có gì sai khi gán các cột trực tiếp như thế này. Đó là một giải pháp hoàn hảo tốt.

Lợi thế của việc sử dụng set_axis là nó có thể được sử dụng như là một phần của một chuỗi phương thức và nó trả về một bản sao mới của DataFrame. Không có nó, bạn sẽ phải lưu trữ các bước trung gian của chuỗi của bạn vào một biến khác trước khi gán lại các cột.

# 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()

92
2017-10-24 13:39



Cảm ơn bạn vì Pandas 0.21+ answer- bằng cách nào đó tôi đã bỏ lỡ phần đó trong phần "có gì mới" ... - MaxU
Giải pháp này dường như không hoạt động cho Pandas 3.6: df.rename ({'$ a': 'a', '$ b': 'b', '$ c': 'c', '$ d': 'd ',' $ e ':' e '}, trục =' cột '). Nhận đối số từ khóa không mong muốn "trục" - Arthur D. Howland
df.columns = ['a', 'b', 'c', 'd', 'e'] dường như không hoạt động nữa, làm việc với phiên bản 0.22 Tôi có cảnh báo Gấu trúc không cho phép tạo cột thông qua tên thuộc tính mới . cách đổi tên nếu tất cả các cột của tôi được gọi giống nhau: / - Nabla


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

Nó sẽ thay thế các tên hiện tại bằng tên bạn cung cấp theo thứ tự bạn cung cấp.

Bạn cũng có thể gán chúng theo chỉ mục như thế này:

df.columns.values[2] = 'c'    #renames the 2nd column to 'c' (in position #3)

67
2018-03-22 08:59



Không sửa đổi df.columns.values, Sai rồi. stackoverflow.com/questions/43291781/… - liliscent


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)

Bằng cách này bạn có thể chỉnh sửa thủ công new_names Như bạn ước. Hoạt động tốt khi bạn cần đổi tên chỉ một vài cột để sửa lỗi chính tả, dấu trọng âm, xóa ký tự đặc biệt, v.v.


53
2018-05-21 17:48



Tôi thích cách tiếp cận này, nhưng tôi nghĩ df.columns = ['a', 'b', 'c', 'd', 'e'] đơn giản hơn. - Christopher Pearson
Tôi thích phương pháp nén tên cũ và mới này. Chúng ta có thể sử dụng df.columns.values để có được những cái tên cũ. - bkowshik
Tôi hiển thị dạng xem bảng và sao chép các cột thành old_names. Tôi sao chép mảng yêu cầu vào new_names. Sau đó sử dụng dict (zip (old_names, new_names)) Giải pháp rất thanh lịch. - mythicalcoder
Tôi thường sử dụng các tập hợp con của các danh sách từ một cái gì đó như: myList = list(df) myList[10:20] , vv - vì vậy điều này là hoàn hảo. - Tim Gottgetreu


Tôi nghĩ phương pháp này hữu ích:

df.rename(columns={"old_column_name1":"new_column_name1", "old_column_name2":"new_column_name2"})

Phương pháp này cho phép bạn thay đổi tên cột riêng lẻ.


31
2018-03-17 09:13





Tên cột so với tên của chuỗi

Tôi muốn giải thích một chút những gì xảy ra đằng sau hậu trường.

Dataframes là một bộ Series.

Series lần lượt là một phần mở rộng của một numpy.array

numpy.arrays có một tài sản .name

Đây là tên của bộ truyện. Rất hiếm khi gấu trúc tôn trọng thuộc tính này, nhưng nó tồn tại ở những nơi và có thể được sử dụng để hack một số hành vi gấu trúc.

Đặt tên danh sách các cột

Rất nhiều câu trả lời ở đây nói về df.columns thuộc tính là một list khi thực tế nó là một Series. Điều này có nghĩa là nó có .name thuộc tính.

Đây là những gì sẽ xảy ra nếu bạn quyết định điền vào tên của các cột 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

Lưu ý rằng tên của chỉ mục luôn thấp hơn một cột.

Các đồ tạo tác được nán lại

Các .name đôi khi thuộc tính tồn tại. Nếu bạn đặt df.columns = ['one', 'two'] sau đó df.one.name sẽ là 'one'.

Nếu bạn đặt df.one.name = 'three' sau đó df.columns vẫn sẽ cung cấp cho bạn ['one', 'two']df.one.name sẽ cho bạn 'three'

NHƯNG

pd.DataFrame(df.one) sẽ trở lại

    three
0       1
1       2
2       3

Bởi vì gấu trúc sử dụng lại .name của đã được xác định Series.

Tên cột đa cấp

Gấu trúc có cách làm tên cột nhiều lớp. Không có quá nhiều ma thuật liên quan nhưng tôi cũng muốn nói điều này trong câu trả lời của mình vì tôi không thấy ai có mặt ở đây.

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

Điều này có thể dễ dàng đạt được bằng cách đặt cột thành danh sách, như sau:

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

30
2017-09-29 12:30