Python 3.x 如何将普通数据帧转换为多索引';基于一定的条件
过了很长一段时间,我参观了SO的熊猫区,得到了一个问题,这个问题的框架确实不好,因此被认为是以一种明确的方式放在这里,类似的情况我也一样:——) 以下是数据帧结构:Python 3.x 如何将普通数据帧转换为多索引';基于一定的条件,python-3.x,pandas,multi-index,Python 3.x,Pandas,Multi Index,过了很长一段时间,我参观了SO的熊猫区,得到了一个问题,这个问题的框架确实不好,因此被认为是以一种明确的方式放在这里,类似的情况我也一样:——) 以下是数据帧结构: >>> df measure Pend Job Run Job Time cls ABC [inter, batch] [101, 93] [302, 1327] [56, 131] DEF [inter, batch] [24279, 421]
>>> df
measure Pend Job Run Job Time
cls
ABC [inter, batch] [101, 93] [302, 1327] [56, 131]
DEF [inter, batch] [24279, 421] [4935, 5452] [75, 300]
期望的输出是。。。
我努力工作,但没有得到任何解决方案,因此,尽管在这里画草图,因为我希望它能实现
----------------------------------------------------------------------------------
| |Pend Job | Run Job | Time |
cls | measure |-----------------------------------------------------------
| |inter | batch| |inter | batch| |inter | batch |
----|-----------------|------|------|-------|------|------|-----|------|----------
ABC |inter, batch |101 |93 | |302 |1327 | |56 |131 |
----|-----------------|-------------|-------|------|------|-----|------|---------|
DEF |inter, batch |24279 |421 | |4935 |5452 | |75 |300 |
----------------------------------------------------------------------------------
表示我希望我的数据帧进入多索引数据帧,其中Pend Job
、Run Job
和Time
如上所述位于顶部
编辑:
cls
不在列中这是我的方法,您可以根据需要修改它:
s = (df.drop('measure', axis=1) # remove the measure column
.set_index(df['measure'].apply(', '.join),
append=True) # make `measure` second level index
.stack().explode().to_frame() # concatenate all the values
)
# assign `inter` and `batch` label to each new cell
new_lvl = np.array(['inter','batch'])[s.groupby(level=(0,1,2)).cumcount()]
# or
# new_lvl = np.tile(['inter', 'batch'], len(s)//2)
(s.set_index(new_level, append=True)[0]
.unstack(level=(-2,-1)
.reset_index()
)
输出:
cls measure Pend Job
inter batch
0 ABC inter, batch 101 93
1 DEF inter, batch 24279 421
感谢更新,我将检查+1,但是只是为了确认
cls
不在先前看起来的列中,很抱歉编辑了这篇文章。它给出了一个错误,如KeyError:“['cls']都不在列中”
我没有注意到cls
是原始数据帧的索引。请参阅更新的答案(唯一的变化是s
)。s.groupby(级别=(0,1,2))
而不仅仅是(0,1)
。见更新。