Đổi tên chỉ mục dữ liệu Pandas


141

Tôi có tệp csv không có tiêu đề, với chỉ mục DateTime. Tôi muốn đổi tên chỉ mục và tên cột, nhưng với df.rename () chỉ tên được đổi tên. Bọ cánh cứng? Tôi đang dùng phiên bản 0.12.0

In [2]: df = pd.read_csv(r'D:\Data\DataTimeSeries_csv//seriesSM.csv', header=None, parse_dates=[[0]], index_col=[0] )

In [3]: df.head()
Out[3]: 
                   1
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

In [4]: df.rename(index={0:'Date'}, columns={1:'SM'}, inplace=True)

In [5]: df.head()
Out[5]: 
                  SM
0                   
2002-06-18  0.112000
2002-06-22  0.190333
2002-06-26  0.134000
2002-06-30  0.093000
2002-07-04  0.098667

5
Đối với những người đến với câu hỏi này trong năm 2017, hãy kiểm tra câu trả lời dưới đây để xem giải thích rất chi tiết về rename_axisphương pháp.
Ted Petrou

3
Và đối với những người không thể bận tâm đọc toàn bộ câu trả lời hay dưới đây, thì giải pháp nhanh là df.rename_axis("Date", axis='index', inplace=True)theo tài liệu pandas.pydata.org/pandas-docs/urdy/generated/ trộm hoặcdf.index.names = ['Date']
tommy.carstensen

Câu trả lời:


236

Các renamephương pháp có một cuốn từ điển cho các chỉ số áp dụng cho chỉ số giá trị .
Bạn muốn đổi tên thành tên của cấp chỉ mục:

df.index.names = ['Date']

Một cách tốt để suy nghĩ về điều này là các cột và chỉ mục là cùng một loại đối tượng ( Indexhoặc MultiIndex) và bạn có thể trao đổi hai thông qua chuyển vị.

Điều này hơi khó hiểu vì các tên chỉ mục có ý nghĩa tương tự như các cột, vì vậy đây là một số ví dụ khác:

In [1]: df = pd.DataFrame([[1, 2, 3], [4, 5 ,6]], columns=list('ABC'))

In [2]: df
Out[2]: 
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df1 = df.set_index('A')

In [4]: df1
Out[4]: 
   B  C
A      
1  2  3
4  5  6

Bạn có thể thấy việc đổi tên trên chỉ mục, có thể thay đổi giá trị 1:

In [5]: df1.rename(index={1: 'a'})
Out[5]: 
   B  C
A      
a  2  3
4  5  6

In [6]: df1.rename(columns={'B': 'BB'})
Out[6]: 
   BB  C
A       
1   2  3
4   5  6

Trong khi đổi tên tên cấp:

In [7]: df1.index.names = ['index']
        df1.columns.names = ['column']

Lưu ý: thuộc tính này chỉ là một danh sách và bạn có thể thực hiện việc đổi tên dưới dạng hiểu / liệt kê danh sách.

In [8]: df1
Out[8]: 
column  B  C
index       
1       2  3
4       5  6

2
Câu trả lời chính xác. Chỉ cần một lời nhắc nhở nhẹ nhàng rằng không có "inplace =True", df1.renamesẽ không thực sự thay đổi bất cứ điều gì.
Sarah

63

Câu trả lời hiện được chọn không đề cập đến rename_axisphương pháp có thể được sử dụng để đổi tên các cấp chỉ mục và cột.


Pandas có một số khó khăn khi đổi tên các cấp của chỉ số. Ngoài ra còn có một phương thức DataFrame mới rename_axisđể thay đổi tên cấp chỉ mục.

Chúng ta hãy xem một DataFrame

df = pd.DataFrame({'age':[30, 2, 12],
                       'color':['blue', 'green', 'red'],
                       'food':['Steak', 'Lamb', 'Mango'],
                       'height':[165, 70, 120],
                       'score':[4.6, 8.3, 9.0],
                       'state':['NY', 'TX', 'FL']},
                       index = ['Jane', 'Nick', 'Aaron'])

nhập mô tả hình ảnh ở đây

DataFrame này có một cấp cho mỗi chỉ mục hàng và cột. Cả chỉ số hàng và cột không có tên. Hãy thay đổi tên cấp chỉ mục hàng thành 'tên'.

df.rename_axis('names')

nhập mô tả hình ảnh ở đây

Các rename_axisphương pháp cũng có khả năng để thay đổi tên cột mức độ bằng cách thay đổi các axistham số:

df.rename_axis('names').rename_axis('attributes', axis='columns')

nhập mô tả hình ảnh ở đây

Nếu bạn đặt chỉ mục với một số cột, thì tên cột sẽ trở thành tên cấp chỉ mục mới. Hãy nối các cấp chỉ mục vào DataFrame gốc của chúng tôi:

df1 = df.set_index(['state', 'color'], append=True)
df1

nhập mô tả hình ảnh ở đây

Lưu ý cách chỉ mục gốc không có tên. Chúng ta vẫn có thể sử dụng rename_axisnhưng cần phải vượt qua nó một danh sách có cùng độ dài với số cấp chỉ mục.

df1.rename_axis(['names', None, 'Colors'])

nhập mô tả hình ảnh ở đây

Bạn có thể sử dụng Noneđể xóa tên cấp chỉ mục một cách hiệu quả.


Series hoạt động tương tự nhưng với một số khác biệt

Hãy tạo một Series với ba cấp độ chỉ mục

s = df.set_index(['state', 'color'], append=True)['food']
s

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: food, dtype: object

Chúng ta có thể sử dụng rename_axistương tự như cách chúng ta đã làm với DataFrames

s.rename_axis(['Names','States','Colors'])

Names  States  Colors
Jane   NY      blue      Steak
Nick   TX      green      Lamb
Aaron  FL      red       Mango
Name: food, dtype: object

Lưu ý rằng có một phần siêu dữ liệu bổ sung bên dưới Sê-ri được gọi Name. Khi tạo Sê-ri từ Khung dữ liệu, thuộc tính này được đặt thành tên cột.

Chúng ta có thể truyền tên chuỗi cho renamephương thức để thay đổi nó

s.rename('FOOOOOD')

       state  color
Jane   NY     blue     Steak
Nick   TX     green     Lamb
Aaron  FL     red      Mango
Name: FOOOOOD, dtype: object

DataFrames không có thuộc tính này và infact sẽ đưa ra một ngoại lệ nếu được sử dụng như thế này

df.rename('my dataframe')
TypeError: 'str' object is not callable

Trước gấu trúc 0,21, bạn có thể đã sử dụng rename_axisđể đổi tên các giá trị trong chỉ mục và cột. Nó đã bị phản đối vì vậy đừng làm điều này


1
Bạn có nên trao đổi df1 = df.set_index(['state', 'color'], append=True)với df1.rename_axis(['names', None, 'Colors'])?
salhin

Nếu tôi muốn đổi tên "Nick" thành "Nicolas" thì sao? Đó là những gì tôi đang tìm kiếm khi tôi googled "đổi tên chỉ số gấu trúc" và kết thúc ở đây. EDIT: Oh chờ đã, câu trả lời được chấp nhận giải thích điều đó, ban đầu nó không rõ ràng đối với tôi.
Nông dân Ben

Thật tuyệt, đây là câu trả lời duy nhất có thể được sử dụng trong các bài tập bị xiềng xích!
IanS

19

Đối với pandasphiên bản mới hơn

df.index = df.index.rename('new name')

hoặc là

df.index.rename('new name', inplace=True)

Cái sau được yêu cầu nếu một khung dữ liệu nên giữ lại tất cả các thuộc tính của nó.


18

Trong Pandas phiên bản 0.13 trở lên, tên cấp chỉ mục là bất biến (loại FrozenList) và không còn có thể được đặt trực tiếp. Trước tiên, bạn phải sử dụng Index.rename()để áp dụng các tên cấp chỉ mục mới cho Chỉ mục và sau đó sử dụng DataFrame.reindex()để áp dụng chỉ mục mới cho DataFrame. Ví dụ:

Đối với phiên bản Pandas <0.13

df.index.names = ['Date']

Đối với phiên bản gấu trúc> = 0,13

df = df.reindex(df.index.rename(['Date']))

9
Không đúng! Trong phiên bản Pandas của tôi (0.13.1) df.index.names = ['foo'] hoạt động tốt!
LondonRob

5
Cảm ơn vì đã nhận thấy rằng @LondonRob - `df.index.names = ['foo']` cũng hoạt động với tôi với Pandas 0.14. Rõ ràng là nó chỉ bị hỏng trong một thời gian ngắn và bao gồm khi tôi thử nghiệm nó.
David Smith

1
Đặt tên cho một trong hai indexhoặc columntrực tiếp là thay đổi cả hai cho tôi (trên Pandas 0.19), nhưng không phải với phương pháp này.
FooBar

8

Bạn cũng có thể sử dụng Index.set_namesnhư sau:

In [25]: x = pd.DataFrame({'year':[1,1,1,1,2,2,2,2],
   ....:                   'country':['A','A','B','B','A','A','B','B'],
   ....:                   'prod':[1,2,1,2,1,2,1,2],
   ....:                   'val':[10,20,15,25,20,30,25,35]})

In [26]: x = x.set_index(['year','country','prod']).squeeze()

In [27]: x
Out[27]: 
year  country  prod
1     A        1       10
               2       20
      B        1       15
               2       25
2     A        1       20
               2       30
      B        1       25
               2       35
Name: val, dtype: int64
In [28]: x.index = x.index.set_names('foo', level=1)

In [29]: x
Out[29]: 
year  foo  prod
1     A    1       10
           2       20
      B    1       15
           2       25
2     A    1       20
           2       30
      B    1       25
           2       35
Name: val, dtype: int64

2
Điều này có thể làm việc cho một multiIndex? MultiIndex(levels=[['A', 'B', 'C', 'D', 'E', 'F'], ['Y', 'Z']], labels=[[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]], names=['Portfolio', None])Có thể đổi tên Nonethành measures?
ctrl-alt-xóa

2

Nếu bạn muốn sử dụng cùng một ánh xạ để đổi tên cả cột và chỉ mục, bạn có thể thực hiện:

mapping = {0:'Date', 1:'SM'}
df.index.names = list(map(lambda name: mapping.get(name, name), df.index.names))
df.rename(columns=mapping, inplace=True)

0
df.index.rename('new name', inplace=True)

Là người duy nhất làm công việc cho tôi (gấu trúc 0.22.0).
Không có inplace = True, tên của chỉ mục không được đặt trong trường hợp của tôi.


0

bạn có thể sử dụng indexcolumnscác thuộc tính của pandas.DataFrame. LƯU Ý: số phần tử của danh sách phải khớp với số lượng hàng / cột.

#       A   B   C
# ONE   11  12  13
# TWO   21  22  23
# THREE 31  32  33

df.index = [1, 2, 3]
df.columns = ['a', 'b', 'c']
print(df)

#     a   b   c
# 1  11  12  13
# 2  21  22  23
# 3  31  32  33
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.