pandas20 层次化索引与切片- 选择(tcy)

层次化索引选择 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列

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/85013171
今日推荐