44 pandas DataFrame分層索引切片選擇(tcy)

tcy23456發表於2019-01-06

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:從最外層依次向內取,有幾層就有幾個'.' 

例項3:資料幀

iter_rows = [['a1', 'a2'], ['aa1', 'aa2']]
iter_columns = [['A1', 'A2'], ['AA1', 'AA2']]
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(10,26).reshape((4,4)), index=index_row, columns=index_col)

CN1    A1     A2
CN2   AA1 AA2 AA1 AA2
RN1 RN2
a1 aa1 10 11 12 13
   aa2 14 15 16 17
a2 aa1 18 19 20 21
   aa2 22 23 24 25
# 例項1:df[];‘'(:)'選擇行,'[,]'選擇列
# 例項1.1:int:int - 選取行(僅僅能選取行)
df[0:2] #選取第1,2行

# 例項1.2:索引- 選取行
df['a2':'a2'] #選取(a2,aa1- aa2) 2行
df[('a2','aa1'):('a2','aa1')] #選取(a2,aa1) 1行
df[('a2','aa1'):('a2','aa2')] #選取(a2,aa1) , (a2,aa2) 2行

# 例項1.3:列名- 選擇列
df[('A2','AA1')]                #選取(A2,AA1) 1列
df[[('A2','AA1'),('A2','AA2')]] #選取(A2,AA1),(A2,AA2) 2列

# 例項1.4:索引+列名 - 選擇行列
result1=df[('a1','aa2'):('a1','aa2')][[('A1','AA2'),('A1','AA2')]]#選取第2行第2列數值(結果列多索引廣播)
result1=df[[('A1','AA2'),('A1','AA2')]][('a1','aa2'):('a1','aa2')]#選取第2列第2行數值(結果行多索引廣播)
result2=df[('a1','aa2'):('a2','aa1')][[('A1','AA2'),('A2','AA1')]]#選取行列

# result1           result2
CN1    A1          CN1    A1 A2
CN2    AA2 AA2     CN2   AA2 AA1
RN1 RN2            RN1 RN2
a1 aa2 15 15       a1 aa2 15 16
                   a2 aa1 19 20
例項2:loc
#索引名列名可為str,或[str],或範圍(str:str)

# 例項2.1:單行索引,或單行索引list - 選擇行
df.loc['a2']                        #選取(a2,aa1- aa2) 2行
df.loc[('a2','aa1')]                #選取(a2,aa1) 1行
df.loc[[('a2','aa1'),('a2','aa2')]] #選取(a2,aa1) , (a2,aa2) 2行

# 例項2.2:索引範圍- 選擇行
df.loc[('a1','aa2'):('a2','aa2')]#選取2,3,4行

# 例項2.3:單列名,或單列名list - 選擇列
df.loc[:,'A2']                       #選取(A2,AA1-AA2) 2列
df.loc[:,('A2','AA1')]               #選取(A2,AA1) 1列,Series
df.loc[:,[('A2','AA1'),('A2','AA2')]]#選取(A2,AA1-AA2) 2列

# 例項2.4:列名範圍-選擇列
df.loc[:,('A1','AA2'):('A2','AA2')]#選取第2,3,4列資料

# 例項2.5:索引名+列名-選擇行列或標量
df.loc[('a1','aa1'),('A2','AA1')]  #選取第1行第3列 =12 標量
result1=df.loc[[('a1','aa2'),('a2','aa2')],('A2','AA1')]             #選取行列 返回Series
result2=df.loc[('a1','aa2'):('a2','aa2'),('A2','AA1')]               #選取行列 返回Series
result3=df.loc[[('a1','aa2'),('a2','aa2')],('A1','AA2'):('A2','AA2')]#選取行列

# result1     result2           result3
RN1 RN2       RN1 RN2           CN1 A1      A2
a1 aa2 16     a1 aa2 16         CN2 AA2 AA1 AA2
a2 aa2 24     a2 aa1 20         RN1 RN2
                 aa2 24         a1 aa2 15 16 17
Name: (A2, AA1), dtype: int32   a2 aa2 23 24 25
# 例項3:iloc  
# 例項3.1:索引名int,[int],[int:int]-選取行
df.iloc[1]     #選取第2行
df.iloc[[0,3]] #選取第1,4行
df.iloc[0:3]   #選取第1,2,3行

# 例項3.2:列名int,[int],[int:int]-選取列
df.iloc[:,1]     #選取第2列
df.iloc[:,[0,3]] #選取第1,4列
df.iloc[:,0:3]   #選取第1,2,3列

# 例項3.3:索引名+列名-選取行列
df.iloc[[1],[1]]     #第2行第2列的值15 返回DataFrame
df.iloc[[1,2],[1,2]] #選取行列
df.iloc[[1,2],0:3]   #選取行列

CN1     A1 A2         CN1    A1      A2
CN2     AA2 AA1       CN2    AA1 AA2 AA1
RN1 RN2               RN1 RN2
a1 aa2  15 16         a1 aa2 14  15  16
a2 aa1  19 20         a2 aa1 18  19  20
# 例項4:
# 例項4.1:iat選取元素 不受多索引影響
df.iat[1,2] #選取第2行第3列數值=16

# 例項4.2:屬性訪問
df.A1     #選取第1,2列
df.A1.AA1 #選取第1列

# 例項4.3:get函式 列名或列名list或切片
#僅能選取行或列

df.get('A1')                       #選取第1,2列
df.get(('A1','AA1'))               #選取第一列 返回Series
df.get([('A1','AA2'),('A2','AA2')])#選取第2,4列
df.get(slice(0,3))                 #選取第1,2,3行

相關文章