2014-12-05 15 views
5

Tôi đang cố gắng tìm ra nếu có một cách để đổi tên các cột Pandas khi bạn cố gắng thiết lập lại chỉ mục. Tôi thấy trong tài liệu mà bạn có thể sử dụng tham số "name" để đặt tên cột của chỉ mục đặt lại nếu chỉ có một cột, nhưng tôi tò mò nếu có cách để làm điều này cho nhiều cột.Làm thế nào để đổi tên nhiều cột trên một chỉ số thiết lập lại với gấu trúc

Ví dụ:

df1 = pd.DataFrame({ 
'A' : ['a1', 'a1', 'a2', 'a3'], 
'B' : ['b1', 'b2', 'b3', 'b4'], 
'D1' : [1,0,0,0], 
'D2' : [0,1,1,0], 
'D3' : [0,0,1,1], 
}) 

df1.set_index(['B','A']).stack().reset_index() 

Kết quả lá bạn với:

Out[82]: 
    B A level_2 0 
0 b1 a1  D1 1 
1 b1 a1  D2 0 
2 b1 a1  D3 0 
3 b2 a1  D1 0 
4 b2 a1  D2 1 

Bạn có thể làm:

df1.set_index(['B','A']).stack().reset_index(name='my_col') 

Để thiết lập tên của cột cuối cùng nhưng tôi Tôi tự hỏi nếu có một cách để sử dụng tham số để đặt tên của cột 'level_2' là tốt.

Điều đầu tiên mà đến tâm trí của tôi là để thử:

df1.set_index(['B','A']).stack().reset_index(name=['my_col2','my_col']) 

Tuy nhiên, điều đó không làm việc để tìm kiếm một cách khác xung quanh. Tôi nhận ra rằng tôi luôn có thể đổi tên các cột trong dòng tiếp theo nhưng hy vọng sẽ có một cách rõ ràng hơn để làm điều đó trong một dòng.

Cảm ơn! Sam

+0

Tôi không nghĩ rằng nó có thể, bạn sẽ thấy, 'reset_index()' trong mã của bạn là thực sự http://pandas.pydata.org/pandas-docs/stable /generated/pandas.Series.reset_index.html, vì vậy bạn chỉ có một cột. Những gì bạn có thể làm là đặt tên của các cột của chỉ mục trong chuỗi của bạn và sau đó chúng sẽ vẫn là tên của các cột của DataFrame –

Trả lời

3

reset_index là không đủ thông minh để làm điều này, nhưng chúng ta có thể tận dụng các phương pháp rename_axisrename để cung cấp cho tên để chỉ mục và các cột/hàng loạt trước khi đặt lại chỉ mục; một khi tên được thiết lập đúng cách, reset_index sẽ tự động chuyển đổi các tên này để các tên cột trong kết quả:

đây rename_axis cho tên để chỉ số đó là hơi tương đương với df.index.names = ... trừ trong một phong cách chức năng; rename cho tên cho đối tượng Series:

df1.set_index(['B','A']).stack().rename_axis(['B','A','col2']).rename('col').reset_index() 

# B A col2 col 
#0 b1 a1 D1 1 
#1 b1 a1 D2 0 
#2 b1 a1 D3 0 
#3 b2 a1 D1 0 
#4 b2 a1 D2 1 
# .. 
Các vấn đề liên quan