python pandas:重命名多索引数据框中的单列标签

Posted

技术标签:

【中文标题】python pandas:重命名多索引数据框中的单列标签【英文标题】:python pandas: rename single column label in multi-index dataframe 【发布时间】:2015-06-04 20:20:05 【问题描述】:

我有一个看起来像这样的 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() 会有所帮助,但事实并非如此。不知道该怎么做?

【问题讨论】:

在较新版本的 pandas 中,df.rename() 可用于重命名特定关卡。请参阅下面的kadee's 答案。 【参考方案1】:

使用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

【讨论】:

感谢您的努力!【参考方案2】:
df.columns.set_levels(['one', 'two'], level=0, inplace=True)

【讨论】:

感谢您的努力!【参考方案3】:

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')

【讨论】:

【参考方案4】:

这是个好问题。结合上面的答案,可以写一个函数:

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。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

从 pandas 0.22.0(可能更早)开始,您可以指定级别:

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

或者,或者(自 pandas 0.21.0 以来的新符号):

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

但实际上,即使省略关卡也可以:

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

在这种情况下,将检查所有列级别以查找要重命名的事件。

【讨论】:

以上是关于python pandas:重命名多索引数据框中的单列标签的主要内容,如果未能解决你的问题,请参考以下文章

Python,pandas:如何从对称的多索引数据框中提取值

在多索引 Python Panda 数据框中过滤多个项目

熊猫:重命名多索引df中的列标签

如何使用单个索引更新多索引数据框中的记录

pandas:在多索引数据框中转换索引类型

将多索引数据帧的索引值提取为python中的简单列表