使用 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
我想在旋转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