pandas,重命名多索引列(数据顺序已更改)

pandas, renaming a multiindex column (order of data is changed)

我有以下数据框:

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

看起来像:

现在我想摆脱短语 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)

数据变更:

我看到 cols 的条目数多于级别 1 的多索引名称:

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

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

编辑:解决方法

df.unstack().reset_index()

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

可以使用cols = [item.split('_')[1] for item in df.columns.levels[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}})

选项 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