我确实有以下数据框:
{'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()
与重命名列并拆分列值一起工作:
答案 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 = '/'
;这将保持对齐。