过了很长一段时间,我访问了 SO 的 pandas 部分,并得到了一个问题,这个问题确实没有很好地框架,因此我想以明确的方式放在这里,因为我也有类似的情况:-)
下面是数据框结构:
>>> 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 |
----------------------------------------------------------------------------------
说我希望我的 dataFrame 进入 MultiIndex Dataframe,其中 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
关于python-3.x - 如何根据特定条件将普通数据框转换为多索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61231396/