2017-02-26 71 views
1

后我想枢转数据帧(从模拟记录)后到子集的以下数据帧子集上大熊猫数据帧使用pivot_table

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' ] 
     }) 

然后转动数据帧:

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 

我该如何这个pivoted DataFrame,以便runid 26和列a和b被选中(这样我就可以用runid 26从所有进程中减去a,并存储这些值用于分析)。

回答

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 
+0

谢谢!我该如何添加一个添加列'bminusa'到这个子集的值减去一个? – Rene

+0

@Rene'sub_df.time.b - sub_df.time.a'?您应该查看文档的[MultiIndex/Advanced Indexing](http://pandas.pydata.org/pandas-docs/stable/advanced.html)部分。 – miradulo