簡體   English   中英

python pandas:在多索引數據框中重命名單列標簽

[英]python pandas: rename single column label in multi-index dataframe

我有一個看起來像這樣的df:

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”重命名為“一”和“二”?

我以為df.rename()會有所幫助,但沒有幫助。 不知道該怎么做?

這確實是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')

使用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
df.columns.set_levels(['one', 'two'], level=0, inplace=True)

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

從大熊貓0.22.0開始(可能更早),您可以指定級別:

df = df.rename(columns={'1': one, '2': two}, level=0)

或者,(自熊貓0.21.0起的新符號):

df = df.rename({'1': one, '2': two}, axis='columns', level=0)

但是實際上,即使省略該級別,它也可以工作:

df = df.rename(columns={'1': one, '2': two})

在這種情況下,將檢查所有列級別以查找要重命名的事件。

這是一個很好的問題。 結合以上答案,您可以編寫一個函數:

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

它為我工作。

理想情況下,將來應將此類功能集成到“官方”“重命名”功能中,因此您無需編寫此類hack。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM