2017-09-25 68 views
3

我有以下数据框:大熊猫,重命名一个多指标列(数据的顺序被改变)

{'e1.data_280': {0: 10, 1: 20, 2: 30}, 
'e1.data_603': {0: 7, 1: 8, 2: 9}, 
'e2.data_280': {0: 30, 1: 20, 2: 10}, 
'e2.data_603': {0: 8, 1: 9, 2: 1}} 

后:

df.columns = df.columns.str.split('.', expand=True) 

它看起来像:

enter image description here

现在我想摆脱短语data_

落后下划线的三个数字:

cols = [item.split('_')[1] for item in df.columns.get_level_values(1)] 
cols 
['603', '280', '603', '280'] 

如果我取代旧的标签:

df.columns.set_levels(cols, level=1, inplace=True) 

的数据被更改:

enter image description here

我看到cols比第1级多重索引的名称多:

MultiIndex(levels=[['e1', 'e2'], ['data_280', 'data_603']], 
      labels=[[0, 0, 1, 1], [1, 0, 1, 0]]) 

但是,如何重命名数据框中第一级多索引列?

编辑:一种解决方法

df.unstack().reset_index() 

与重命名列和分裂的列值一起工作:

+1

我在运行代码时似乎得到了你想要的结果。 – GiantsLoveDeathMetal

+0

但是,当我通过'inplace = True'时遇到错误,但是所需的df是我没有它的时候得到的。 – GiantsLoveDeathMetal

+0

@GiantsLoveDeathMetal你运行的是什么熊猫版本? – Moritz

回答

3

设置

df = pd.DataFrame({ 
    'e1.data_280': {0: 10, 1: 20, 2: 30}, 
    'e1.data_603': {0: 7, 1: 8, 2: 9}, 
    'e2.data_280': {0: 30, 1: 20, 2: 10}, 
    'e2.data_603': {0: 8, 1: 9, 2: 1}}) 

选项1
最简单的事情会一直以包括在你的第一次分裂。

df = pd.DataFrame({ 
    'e1.data_280': {0: 10, 1: 20, 2: 30}, 
    'e1.data_603': {0: 7, 1: 8, 2: 9}, 
    'e2.data_280': {0: 30, 1: 20, 2: 10}, 
    'e2.data_603': {0: 8, 1: 9, 2: 1}}) 

df.columns = df.columns.str.split('.data_', expand=True) 

df 

    e1  e2  
    280 603 280 603 
0 10 7 30 8 
1 20 8 20 9 
2 30 9 10 1 

选项2
的事实后,你可以做

df.rename(columns=lambda x: x.replace('data_', '')) 

    e1  e2  
    280 603 280 603 
0 10 7 30 8 
1 20 8 20 9 
2 30 9 10 1 

你甚至可以传递一个level缩小rename范围。这确保我们不会在level=0列对象上执行replace

df.rename(columns=lambda x: x.replace('data_', ''), level=1) 

    e1  e2  
    280 603 280 603 
0 10 7 30 8 
1 20 8 20 9 
2 30 9 10 1 
0

您可以使用cols = [item.split('_')[1] for item in df.columns.levels[1]];这将保持对齐。

+0

当我在创建'cols'时,按照相同的顺序运行了吗? – GiantsLoveDeathMetal

+0

我不这么认为,但如果0级的两个值在1级有不同的子集,那么你的方法就会失败。 –