2015-03-31 20 views
11

Tôi có một df trông như thế này:gấu trúc python: đổi tên nhãn cột duy nhất trong đa-index dataframe

df = pd.DataFrame(np.random.random((4,4))) 
df.columns = pd.MultiIndex.from_product([['1','2'],['A','B']]) 
print df 
      1     2   
      A   B   A   B 
0 0.030626 0.494912 0.364742 0.320088 
1 0.178368 0.857469 0.628677 0.705226 
2 0.886296 0.833130 0.495135 0.246427 
3 0.391352 0.128498 0.162211 0.011254 

Làm thế nào tôi có thể đổi tên cột '1' và '2' là 'Một' và 'Hai '?

Tôi nghĩ df.rename() có thể đã giúp nhưng không. Không có ý tưởng làm thế nào để làm điều này?

Trả lời

17

Đó thực sự là một cái gì đó mất tích trong rename (lý tưởng nó sẽ cho phép bạn xác định mức).
Một cách khác là bằng cách thiết lập các mức chỉ số cột, nhưng sau đó bạn cần phải biết tất cả các giá trị cho mức đó:

In [41]: df.columns.levels[0] 
Out[41]: Index([u'1', u'2'], dtype='object') 

In [43]: df.columns = df.columns.set_levels(['one', 'two'], level=0) 

In [44]: df 
Out[44]: 
     one     two 
      A   B   A   B 
0 0.899686 0.466577 0.867268 0.064329 
1 0.162480 0.455039 0.736870 0.759595 
2 0.620960 0.922119 0.060141 0.669997 
3 0.871107 0.043799 0.080080 0.577421 

In [45]: df.columns.levels[0] 
Out[45]: Index([u'one', u'two'], dtype='object') 
+0

Cảm ơn rất nhiều. –

4

Sử dụng set_levels:

>>> df.columns.set_levels(['one','two'], 0, inplace=True) 
>>> print(df) 
     one     two   
      A   B   A   B 
0 0.731851 0.489611 0.636441 0.774818 
1 0.996034 0.298914 0.377097 0.404644 
2 0.217106 0.808459 0.588594 0.009408 
3 0.851270 0.799914 0.328863 0.009914 
+0

Cảm ơn nỗ lực! –

3
df.columns.set_levels(['one', 'two'], level=0, inplace=True) 
+0

Cảm ơn bạn đã nỗ lực! –

0

Đây là một câu hỏi hay. Kết hợp câu trả lời ở trên, bạn có thể viết một hàm:

def rename_col(df, columns, level = 0): 

    def rename_apply (x, rename_dict): 
     try: 
      return rename_dict[x] 
     except KeyError: 
      return x 

    if isinstance(df.columns, pd.core.index.MultiIndex): 
     df.columns = df.columns.set_levels([rename_apply(x, rename_dict = columns) for x in df.columns.levels[level]], level= level) 
    else: 
     df.columns =      [rename_apply(x, rename_dict = columns) for x in df.columns    ] 

    return df 

Nó làm việc cho tôi.

Lý tưởng nhất, một chức năng như thế này sẽ được tích hợp vào chức năng "đổi tên" chính thức "" trong tương lai, vì vậy bạn không cần phải viết một bản hack như thế này.

2

df.rename_axis({'1':'one', '2':'two'}, axis='columns', inplace=True)

Các vấn đề liên quan