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

时间:2017-02-26 19:14:57

标签: python pandas dataframe pivot subset

我希望在转动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

如何对此透视数据框进行子集,以便选择runid 26和a和b列(这样我就可以从具有runid 26的所有进程中减去a b并存储这些值进行分析)。

1 个答案:

答案 0 :(得分:1)

您可以使用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