层次化索引选择 2018/12/15
1.总结:以2个层次标签为例说明
obj[(label,label)]/obj.loc[(label,label)] #label为单个标签,标签切片,标签列表;注1
obj[(loc,loc)]/obj.iloc[(loc,loc)] #loc为int,int切片; 注1
obj[bool_vec] #bool数组选择
s.a1.b1 #注2
df.C1.D1
s.get(label) #label为最外层标签,为单标签或标签列表
df.get(label) #label为最外层列标签,为单标签或标签列表
注1:有几层就有几个参数,从前向后依次为第一层,第二层,...
注2:从最外层依次向内取,有几层就有几个'.'
2.实例:序列
iterables = [['a1', 'a2', 'a3'], ['b1', 'b2','b3']]
index=pd.MultiIndex.from_product(iterables2, names=['N1', 'N2'])
s = pd.Series(np.arange(9), index=index2)
s['a1'] , s.loc['a1'] #选择第1,2,3行数据
s['a1':'a2'] #选择第1...6行数据
s[['a1','a2']] #选择第1...6行数据
s[('a1','b1'):('a1','b1')]#0
s[('a1','b1'):('a1','b2')]#选择第1,2行数据
s[2],s.iloc[2] #2
s[2:5] #2,3,4#选择第3,4,5行数据
s[s<3] , s.loc[s<3] #选择第1,2,3行数据
s.a1 #选择第1,2,3行数据
s.a1.b1 #0
s.get('[a1','a2']) #选择第1...6行数据
s[:,'b1'] #0,3,6
# 层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演重要角色。
(s.unstack().stack()==s).all()#True
s.unstack()
# b1 b2 b3
# a1 0 1 2
# a2 3 4 5
# a3 6 7 8
3.数据帧:
iter_rows = [['a1', 'a2', 'a3'], ['b1', 'b2','b3']]
iter_columns = [['C1', 'C2', 'C3'], ['D1', 'D2','D3']]
index_row=pd.MultiIndex.from_product(iter_rows, names=['RN1', 'RN2'])
index_col =pd.MultiIndex.from_product(iter_columns, names=['CN1', 'CN2'])
df = pd.DataFrame(np.arange(81).reshape((9,9)), index=index_row, columns=index_col)
# CN1 C1 C2 C3
# CN2 D1 D2 D3 D1 D2 D3 D1 D2 D3
# RN1 RN2
# a1 b1 0 1 2 3 4 5 6 7 8
# b2 9 10 11 12 13 14 15 16 17
# b3 18 19 20 21 22 23 24 25 26
# a2 b1 27 28 29 30 31 32 33 34 35
# b2 36 37 38 39 40 41 42 43 44
# b3 45 46 47 48 49 50 51 52 53
# a3 b1 54 55 56 57 58 59 60 61 62
# b2 63 64 65 66 67 68 69 70 71
# b3 72 73 74 75 76 77 78 79 80
实例1:
df[0:2] #选取第1,2行
df['a2':'a2'] #选取(a2,b1- b3) 3行
df[('a2','b1'):('a2','b1')] #选取(a2,b1) 1行
df[('a2','b1'):('a2','b2')] #选取(a2,b1) , (a2,b2) 2行
df[('C2','D1')] #选取(C2,D1) 1列
df[[('C2','D1'),('C2','D2')]] #选取(C2,D1),(C2,D2) 2列
df[('a2','b3'):('a3','b2')][[('C2','D1'),('C3','D2')]]#选取行列
# CN1 C2 C3
# CN2 D1 D2
# RN1 RN2
# a2 b3 48 52
# a3 b1 57 61
# b2 66 70
实例2:
df.loc['a2'] #选取(a2,b1- b3) 3行
df.loc[('a2','b1')] #选取(a2,b1) 1行
df.loc[[('a2','b1'),('a2','b2')]] #选取(a2,b1) , (a2,b2) 2行
df.loc[:,'C2'] #选取(C2,D1-D3) 3列
df.loc[:,[('C2','D1'),('C2','D2')]]#选取(C2,D1-D2) 2列
df.loc[:,('C2','D1')] #选取(C2,D1) 1列
df.loc[('a1','b1'),('C2','D1')] #选取行列 =3
df.loc[[('a1','b1'),('a1','b2')],('C2','D1')]#选取行列
# RN1 RN2
# a1 b1 3
# b2 12
# Name: (C2, D1), dtype: int32
实例3:
df.iloc[1] #选取(a1,b2) 1行
df.iloc[[1,2]] #选取(a1,b2-b3) 2行
df.iloc[:,1] #选取(C1,D2) 1列
df.iloc[:,[1,2]] #选取(C1,D2-D3) 2列
df.iloc[[1,2],[1,2]]#选取行列
# CN1 C1
# CN2 D2 D3
# RN1 RN2
# a1 b2 10 11
# b3 19 20
实例4:
df.iat[1,2] #选取第2行第3列数值=11
df.C1.D1 #选取第一列
df.get(('C1','D1'))#选取第一列
df.get('C1') #选取第1,2,3列