使用 pivot_table 后对 pandas 数据帧进行子集化

Subsetting on pandas dataframe after using pivot_table

我想在旋转DataFrame(从模拟记录)后对以下DataFrame 进行子集化:

import pandas as pd

df = pd.DataFrame(
        {'runid'  : [26  , 26  , 26  ,  26 , 26  , 26  , 27  , 27  , 27  , 27  , 27  , 27  ],
         'time'   : [0   ,  1  , 1   ,  3  , 5   , 7   , 0   , 0   , 0   , 2   , 4   , 5   ],
         'process': ['p1', 'p2', 'p2', 'p1', 'p1', 'p2', 'p1', 'p1', 'p2', 'p2', 'p2', 'p1'],
         'state'  : ['a' , 'a' , 'b' , 'b' , 'c' , 'c' , 'a' , 'b' , 'a' , 'b' , 'c' , 'c' ]
         })

然后旋转 DataFrame:

data = pd.pivot_table(df, index=['runid', 'process'], columns=['state'], values=['time'])

输出:

              time      
state            a  b  c
runid process           
26    p1         0  3  5
      p2         1  1  7
27    p1         0  0  5
      p2         0  2  4

我如何对这个旋转的 DataFrame 进行子集化,以便选择 runid 26 以及列 a 和 b(这样我就可以为所有具有 runid 26 的进程从 b 中减去 a 并存储这些值以供分析)。

您可以使用 pd.IndexSlice 对象使语法更好一些,然后只需 loc

>>> idx = pd.IndexSlice
>>> data.loc[idx[26, :], idx[:, ['a', 'b']]]

              time   
state            a  b
runid process        
26    p1         0  3
      p2         1  1