Tiêu đề hoặc tên cột chỉ số gấu trúc


254

Làm thế nào để tôi có được tên cột chỉ mục trong gấu trúc python? Dưới đây là một khung dữ liệu mẫu:

             Column 1
Index Title          
Apples              1
Oranges             2
Puppies             3
Ducks               4  

Những gì tôi đang cố gắng làm là nhận / đặt tiêu đề chỉ mục khung dữ liệu. Đây là những gì tôi đã cố gắng:

import pandas as pd
data = {'Column 1'     : [1., 2., 3., 4.],
        'Index Title'  : ["Apples", "Oranges", "Puppies", "Ducks"]}
df = pd.DataFrame(data)
df.index = df["Index Title"]
del df["Index Title"]
print df

Bất cứ ai biết làm thế nào để làm điều này?

Câu trả lời:


366

Bạn có thể chỉ bị / thiết lập các chỉ số qua nó namesở hữu

In [7]: df.index.name
Out[7]: 'Index Title'

In [8]: df.index.name = 'foo'

In [9]: df.index.name
Out[9]: 'foo'

In [10]: df
Out[10]: 
         Column 1
foo              
Apples          1
Oranges         2
Puppies         3
Ducks           4

10
Đến bây giờ (0.16) nó không hoạt động. Hay đúng hơn - nó hoạt động, nhưng ngay sau khi DataFrame được sửa đổi, nó sẽ xóa tên chỉ mục.
Piotr Migdal

11
có thể chỉ định tên chỉ mục tại thời điểm tạo DataFrame. ví dụ pd.DataFrame(values,index={"INDEX_NAME":index_values}). Tôi không hiểu tại sao điều này không được phép hoặc thực hiện?
denfromufa

1
bạn có thể trực tiếp xây dựng với một Chỉ mục để thêm tên
Jeff

@Jeff, có vẻ như quan sát của bạn rằng việc xây dựng chỉ mục trước tiên (và sử dụng nó cho chỉ mục và cột của dataframe) là cách tiếp cận chính xác mặc dù tôi đồng ý @denfromufarằng nó nên lấy một tham số làm tham số từ pandas.DataFrame
Diego Aguado

3
Nếu nó là Multiindex, hãy sử dụng df.index.namesthay vì df.index.name.
Jasha

75

Bạn có thể sử dụng rename_axis, để xóa thiết lập thành None:

d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]}
df = pd.DataFrame(d).set_index('Index Title')
print (df)
             Column 1
Index Title          
Apples            1.0
Oranges           2.0
Puppies           3.0
Ducks             4.0

print (df.index.name)
Index Title

print (df.columns.name)
None

Các chức năng mới hoạt động tốt trong chuỗi phương pháp.

df = df.rename_axis('foo')
print (df)
         Column 1
foo              
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

Bạn cũng có thể đổi tên tên cột bằng tham số axis:

d = {'Index Title': ['Apples', 'Oranges', 'Puppies', 'Ducks'],'Column 1': [1.0, 2.0, 3.0, 4.0]}
df = pd.DataFrame(d).set_index('Index Title').rename_axis('Col Name', axis=1)
print (df)
Col Name     Column 1
Index Title          
Apples            1.0
Oranges           2.0
Puppies           3.0
Ducks             4.0

print (df.index.name)
Index Title

print (df.columns.name)
Col Name
print df.rename_axis('foo').rename_axis("bar", axis="columns")
bar      Column 1
foo              
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

print df.rename_axis('foo').rename_axis("bar", axis=1)
bar      Column 1
foo              
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

Từ phiên bản pandas 0.24.0+có thể sử dụng tham số indexcolumns:

df = df.rename_axis(index='foo', columns="bar")
print (df)
bar      Column 1
foo              
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

Xóa tên chỉ mục và cột có nghĩa là đặt nó thành None:

df = df.rename_axis(index=None, columns=None)
print (df)
         Column 1
Apples        1.0
Oranges       2.0
Puppies       3.0
Ducks         4.0

Nếu MultiIndexchỉ trong chỉ mục:

mux = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'],
                                  list('abcd')], 
                                  names=['index name 1','index name 1'])


df = pd.DataFrame(np.random.randint(10, size=(4,6)), 
                  index=mux, 
                  columns=list('ABCDEF')).rename_axis('col name', axis=1)
print (df)
col name                   A  B  C  D  E  F
index name 1 index name 1                  
Apples       a             5  4  0  5  2  2
Oranges      b             5  8  2  5  9  9
Puppies      c             7  6  0  7  8  3
Ducks        d             6  5  0  1  6  0

print (df.index.name)
None

print (df.columns.name)
col name

print (df.index.names)
['index name 1', 'index name 1']

print (df.columns.names)
['col name']

df1 = df.rename_axis(('foo','bar'))
print (df1)
col name     A  B  C  D  E  F
foo     bar                  
Apples  a    5  4  0  5  2  2
Oranges b    5  8  2  5  9  9
Puppies c    7  6  0  7  8  3
Ducks   d    6  5  0  1  6  0

df2 = df.rename_axis('baz', axis=1)
print (df2)
baz                        A  B  C  D  E  F
index name 1 index name 1                  
Apples       a             5  4  0  5  2  2
Oranges      b             5  8  2  5  9  9
Puppies      c             7  6  0  7  8  3
Ducks        d             6  5  0  1  6  0

df2 = df.rename_axis(index=('foo','bar'), columns='baz')
print (df2)
baz          A  B  C  D  E  F
foo     bar                  
Apples  a    5  4  0  5  2  2
Oranges b    5  8  2  5  9  9
Puppies c    7  6  0  7  8  3
Ducks   d    6  5  0  1  6  0

Xóa tên chỉ mục và cột có nghĩa là đặt nó thành None:

df2 = df.rename_axis(index=(None,None), columns=None)
print (df2)

           A  B  C  D  E  F
Apples  a  6  9  9  5  4  6
Oranges b  2  6  7  4  3  5
Puppies c  6  3  6  3  5  1
Ducks   d  4  9  1  3  0  5

Đối với MultiIndexchỉ số và cột là làm việc cần thiết với .namesthay .namevà thiết lập bởi danh sách hoặc các bộ:

mux1 = pd.MultiIndex.from_arrays([['Apples', 'Oranges', 'Puppies', 'Ducks'],
                                  list('abcd')], 
                                  names=['index name 1','index name 1'])


mux2 = pd.MultiIndex.from_product([list('ABC'),
                                  list('XY')], 
                                  names=['col name 1','col name 2'])

df = pd.DataFrame(np.random.randint(10, size=(4,6)), index=mux1, columns=mux2)
print (df)
col name 1                 A     B     C   
col name 2                 X  Y  X  Y  X  Y
index name 1 index name 1                  
Apples       a             2  9  4  7  0  3
Oranges      b             9  0  6  0  9  4
Puppies      c             2  4  6  1  4  4
Ducks        d             6  6  7  1  2  8

Số nhiều là cần thiết cho các giá trị kiểm tra / thiết lập:

print (df.index.name)
None

print (df.columns.name)
None

print (df.index.names)
['index name 1', 'index name 1']

print (df.columns.names)
['col name 1', 'col name 2']

df1 = df.rename_axis(('foo','bar'))
print (df1)
col name 1   A     B     C   
col name 2   X  Y  X  Y  X  Y
foo     bar                  
Apples  a    2  9  4  7  0  3
Oranges b    9  0  6  0  9  4
Puppies c    2  4  6  1  4  4
Ducks   d    6  6  7  1  2  8

df2 = df.rename_axis(('baz','bak'), axis=1)
print (df2)
baz                        A     B     C   
bak                        X  Y  X  Y  X  Y
index name 1 index name 1                  
Apples       a             2  9  4  7  0  3
Oranges      b             9  0  6  0  9  4
Puppies      c             2  4  6  1  4  4
Ducks        d             6  6  7  1  2  8

df2 = df.rename_axis(index=('foo','bar'), columns=('baz','bak'))
print (df2)
baz          A     B     C   
bak          X  Y  X  Y  X  Y
foo     bar                  
Apples  a    2  9  4  7  0  3
Oranges b    9  0  6  0  9  4
Puppies c    2  4  6  1  4  4
Ducks   d    6  6  7  1  2  8

Xóa tên chỉ mục và cột có nghĩa là đặt nó thành None:

df2 = df.rename_axis(index=(None,None), columns=(None,None))
print (df2)

           A     B     C   
           X  Y  X  Y  X  Y
Apples  a  2  0  2  5  2  0
Oranges b  1  7  5  5  4  8
Puppies c  2  4  6  3  6  5
Ducks   d  9  6  3  9  7  0

Và giải pháp @Jeff:

df.index.names = ['foo','bar']
df.columns.names = ['baz','bak']
print (df)

baz          A     B     C   
bak          X  Y  X  Y  X  Y
foo     bar                  
Apples  a    3  4  7  3  3  3
Oranges b    1  2  5  8  1  0
Puppies c    9  6  3  9  6  3
Ducks   d    3  2  1  0  1  0

7
Tôi tin rằng đây sẽ là câu trả lời được chấp nhận cho các phiên bản hiện tại của gấu trúc
Thomas Fauskanger

2
Cũng đáng chú ý, như phil gợi ý trong một cái khác, df.index.rename('foo', inplace=True)hãy xem pandas.pydata.org/pandas-docs/urdy/generated/ Kẻ
Thomas Fauskanger

Tôi đã nhập từ điển để sử dụng làm khung dữ liệu do đó cột chỉ mục được đặt tự động thành Không có hàng được đánh số 1-10. Nhưng tôi muốn gán cột "tên" làm chỉ mục. Và nếu có thể làm điều này trong âm mưu. Có thể làm điều này và có thể làm điều này một cách nhanh chóng như chúng ta âm mưu không?
TokyoToo

28

df.index.name nên làm thủ thuật.

Python có một dirhàm cho phép bạn truy vấn các thuộc tính đối tượng. dir(df.index)đã hữu ích ở đây.


17

Sử dụng df.index.rename('foo', inplace=True)để đặt tên chỉ mục.

Có vẻ như api này có sẵn kể từ gấu trúc 0.13 .


1
Wow ... một giải pháp tao nhã!
alfonso

13

Nếu bạn không muốn tạo một hàng mới mà chỉ cần đặt nó vào ô trống thì hãy sử dụng:

df.columns.name = 'foo'

Nếu không sử dụng:

df.index.name = 'foo'

1
Chỉ cần tìm thấy nó là một tên cho tên của cột. Không có gì ngạc nhiên khi thiết lập df.index.name cung cấp cho bạn một cấp độ mới. Cảm ơn bạn!
Charles


1

Giải pháp cho đa chỉ mục nằm trong câu trả lời theo chu kỳ của jezrael, nhưng tôi phải mất một thời gian để tìm thấy nó vì vậy tôi đang đăng một câu trả lời mới:

df.index.names đưa ra tên của đa chỉ mục (dưới dạng Frozenlist).


1

Để chỉ nhận được các tên cột chỉ mục df.index.namessẽ hoạt động cho cả một Chỉ mục hoặc Đa chỉ số như phiên bản gấu trúc gần đây nhất.

Là một người đã tìm thấy điều này trong khi cố gắng tìm cách tốt nhất để có được danh sách tên chỉ mục + tên cột, tôi sẽ thấy câu trả lời này hữu ích:

names = list(filter(None, df.index.names + df.columns.values.tolist()))

Điều này hoạt động không có chỉ mục, chỉ mục cột đơn hoặc Multi Index. Nó tránh việc gọi reset_index () có hiệu năng không cần thiết cho một thao tác đơn giản như vậy. Tôi ngạc nhiên không có một phương pháp tích hợp nào cho việc này (mà tôi đã đi qua). Tôi đoán rằng tôi gặp phải nhu cầu này thường xuyên hơn vì tôi chuyển dữ liệu từ cơ sở dữ liệu trong đó chỉ mục khung dữ liệu ánh xạ tới khóa chính / duy nhất, nhưng thực sự chỉ là một cột khác đối với tôi.


1

Đặt tên chỉ mục cũng có thể được thực hiện khi tạo:

pd.DataFrame(data={'age': [10,20,30], 'height': [100, 170, 175]}, index=pd.Series(['a', 'b', 'c'], name='Tag'))
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.