【问题标题】:Renaming MultiIndex columns is not working重命名 MultiIndex 列不起作用
【发布时间】:2018-06-19 13:03:05
【问题描述】:

我正在尝试即时重命名数据框的列。原因是我想做类似的事情

df.rename(..).plot()

这就是我尝试这样做的方式:

import pandas as pd
import numpy as np

np.random.seed(42)

cols = [(100,i) for i in range(1, 6)]
cols_replace = ['Sensor ' + str(i) for i in range(1, len(cols)+1)]

rename_dict = dict(zip(df.columns, cols_replace))

df = pd.DataFrame(np.random.rand(5, len(cols)), columns=pd.MultiIndex.from_tuples(cols))

print(df.rename(columns=rename_dict))

但是,由于某种原因,这不起作用,因为生成的数据框仍然没有显示我正在寻找的列名:

        100                                        
          1         2         3         4         5
0  0.374540  0.950714  0.731994  0.598658  0.156019
1  0.155995  0.058084  0.866176  0.601115  0.708073
2  0.020584  0.969910  0.832443  0.212339  0.181825
3  0.183405  0.304242  0.524756  0.431945  0.291229
4  0.611853  0.139494  0.292145  0.366362  0.456070

为什么这没有像我预期的那样工作,有什么方法可以实现吗?


rename_dict的内容是:

{(100, 1): 'Sensor 1', 
 (100, 2): 'Sensor 2', 
 (100, 3): 'Sensor 3', 
 (100, 4): 'Sensor 4', 
 (100, 5): 'Sensor 5'}

【问题讨论】:

    标签: python pandas dataframe rename multi-index


    【解决方案1】:

    尝试使用带有level 参数的rename -

    df = df.rename(columns='Sensor {}'.format , level=1)  
    

    感谢 Zero 的速记改进。或者,

    i = df.columns.levels[1]   # OP's suggestion, for more flexibility!
    j = ['Sensor ' + str(x) for x in range(1, len(cols) + 1)]
    rename_dict = dict(zip(i, j))
    
    df = df.rename(columns=rename_dict, level=1)
    

    df
            100                                        
       Sensor 1  Sensor 2  Sensor 3  Sensor 4  Sensor 5
    0  0.374540  0.950714  0.731994  0.598658  0.156019
    1  0.155995  0.058084  0.866176  0.601115  0.708073
    2  0.020584  0.969910  0.832443  0.212339  0.181825
    3  0.183405  0.304242  0.524756  0.431945  0.291229
    4  0.611853  0.139494  0.292145  0.366362  0.456070
    

    由于您要在 第一 层(而不是第 0 层)应用重命名操作,请传递 level=1

    【讨论】:

    • 如果您将 = i = range(1, 6) 更改为 i = df.columns.levels[1],它会更加灵活,并且正是我想要的。我想我可以将键作为元组提供,只要它们包含在索引中 - 显然情况并非如此。谢谢,一如既往:)原因是因为ofc的值不一定只是range(..),而是可以是任意的。
    • @displayname 不用担心。另外,很好的调整,谢谢。
    • df.rename(columns='Sensor {}'.format , level=1)的简写
    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 2017-05-04
    • 2017-03-02
    • 2022-01-04
    • 2015-12-31
    • 1970-01-01
    • 2020-09-03
    • 2018-02-06
    相关资源
    最近更新 更多