2016-08-19 26 views
9

Tôi có một dataframe với nhiều cấp độ, ví dụ:Pandas: có được mức multiindex như loạt

idx = pd.MultiIndex.from_product((['foo', 'bar'], ['one', 'five', 'three' 'four']), 
           names=['first', 'second']) 
df = pd.DataFrame({'A': [np.nan, 12, np.nan, 11, 16, 12, 11, np.nan]}, index=idx).dropna().astype(int) 

       A  
first second 
foo five  12 
     four  11 
bar one  16 
     five  12 
     three 11 

Tôi muốn tạo một cột mới bằng mức chỉ số tiêu đề second, vì vậy mà tôi có được

   A B 
first second 
foo five  12 five 
     four  11 four 
bar one  16 one 
     five  12 five 
     three 11 three 

Tôi có thể thực hiện việc này bằng cách đặt lại chỉ mục, sao chép cột, sau đó áp dụng lại, nhưng điều đó có vẻ như vòng quanh.

Tôi đã thử df.index.levels[1], nhưng điều đó tạo ra một danh sách được sắp xếp, nó không giữ được thứ tự.

Nếu đó là một chỉ mục duy nhất, tôi sẽ sử dụng df.index nhưng trong một multiindex tạo cột cột.

Nếu điều này được giải quyết ở nơi khác, vui lòng chia sẻ vì tôi chưa có bất kỳ may mắn nào tìm kiếm kho lưu trữ stackoverflow.

Trả lời

10
df['B'] = df.index.get_level_values(level=1) # Zero based indexing. 
# df['B'] = df.index.get_level_values(level='second') # This also works. 
>>> df 
       A  B 
first second   
foo one  12 one 
     two  11 two 
bar one  16 one 
     two  12 two 
     three 11 three 
+0

có thể thực hiện theo tên chỉ mục? –

+1

Có. 'df.index.get_level_values ​​(level = 'second')' cũng hoạt động. – Alexander

+1

Bạn có thể làm tương tự nếu multiindex vượt qua các cột thay vì chỉ mục bằng cách sử dụng 'df.columns.get_level_values ​​(level = 1)'. –

3
df['B'] = idx.to_series().str[1] 
Các vấn đề liên quan