【问题标题】:How to Convert a Normal Dataframe into MultiIndex'd based on certain condition如何根据特定条件将普通数据帧转换为 MultiIndex'd
【发布时间】:2020-07-28 13:55:27
【问题描述】:

在我访问了 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      |
----------------------------------------------------------------------------------

说我希望我的数据帧进入 MultiIndex 数据帧,其中 Pend JobRun JobTime 如上所述。

编辑:

cls 不在列中

【问题讨论】:

    标签: python-3.x pandas multi-index


    【解决方案1】:

    这是我的方法,您可以根据需要进行修改:

    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: "None of ['cls'] are in the columns"的错误
    • 我没有注意到 cls 是原始数据帧的索引。查看更新的答案(唯一的变化是s 的定义)。
    • s.groupby(level=(0,1,2)) 而不仅仅是(0,1)。查看更新。
    猜你喜欢
    • 2021-04-04
    • 2012-03-09
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2021-07-26
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多