pandas,重命名multiindex列(数据顺序已更改)

时间:2017-09-25 21:55:46

标签: python pandas multi-index

我确实有以下数据框:

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

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

2 个答案:

答案 0 :(得分: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

您甚至可以通过传递rename来缩小level的范围。这可确保我们不会在replace列对象上执行level=0

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

答案 1 :(得分:0)

您可以使用class MedicalCreateView(CreateView): template_name = 'patient/medical_create.html' model = MedicalHistory form_class = MedicalForm success_url = '/' ;这将保持对齐。