44 pandas DataFrame分层索引切片选择(tcy)

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行

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/85936001
44