1. 程式人生 > >pandas20 層次化索引與切片- 選擇(tcy)

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列