2015-03-31 4 views
11

У меня есть ФР, который выглядит следующим образом:питона панды: переименовать одну метку столбца в многоиндексной 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 

Как переименовать столбец «1» и «2» как «One» и «Two «?

Я думал, что df.rename() помогло бы, но это не так. Не знаю, как это сделать?

ответ

17

Это действительно что-то не хватает в rename (в идеале это должно позволить вам определить уровень).
Другим способом является установка уровней индекса столбцов, но тогда вы должны знать все значения для этого уровня:

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

Большое спасибо. –

4

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

Спасибо за внимание! –

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

Спасибо за внимание! –

0

Это хороший вопрос. Объединив ответ выше, вы можете написать сообщение:

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 

Это сработало для меня.

В идеале, такая функциональность в будущем должна быть интегрирована в «официальную» функцию «переименовать», поэтому вам не нужно писать такой взломать.

2

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