loc[]表示基于label的位置索引,iloc[]表示基于数字的索引。这里需要注意的是对于多层次索引中两者的用法,对于iloc[],其用法很简单,iloc[i,j]就表示这个DataFrame的第i行第j列对应的元素,i表示最内侧的索引的位置,j也表示最内侧的索引的位置,所以其就是表示第i行j列的元素。
对于多层次索引中的loc[],其用法比iloc[]复杂一些。loc[]优先表示行索引,如果其要同时体现列索引,则需要以loc[tuple,'a'],其中tuple表示行索引的多层次索引,以第一个元组标志,‘a’表示其对应的column,当然如果columns也是层次索引的话,也同样的可以用元组进行。除此情况之外,其他的情况都是针对行索引,比如loc['c']、loc['c','d']、loc[('c','d')]、loc[[('c','d')]],其都是对行进行索引,第一个表示选取行的最外层索引对应为'c'的内容,第二个表示再深入一层,如果只有两层,返回Series,第三个和第二个作用一样,第四个和前两个一样,但是返回的是DataFrame对象。
下面是从官方文档的例子。
tuples = [
... ('cobra', 'mark i'), ('cobra', 'mark ii'),
... ('sidewinder', 'mark i'), ('sidewinder', 'mark ii'),
... ('viper', 'mark ii'), ('viper', 'mark iii')
... ]
>>> index = pd.MultiIndex.from_tuples(tuples)
>>> values = [[12, 2], [0, 4], [10, 20],
... [1, 4], [7, 1], [16, 36]]
>>> df = pd.DataFrame(values, columns=['max_speed', 'shield'], index=index)
>>> df
max_speed shield
cobra mark i 12 2
mark ii 0 4
sidewinder mark i 10 20
mark ii 1 4
viper mark ii 7 1
mark iii 16 36
df.loc['cobra']
max_speed shield
mark i 12 2
mark ii 0 4
df.loc[('cobra', 'mark ii')]
max_speed 0
shield 4
Name: (cobra, mark ii), dtype: int64
df.loc['cobra', 'mark i']
max_speed 12
shield 2
Name: (cobra, mark i), dtype: int64
df.loc[[('cobra', 'mark ii')]]
max_speed shield
cobra mark ii 0 4
df.loc[('cobra', 'mark i'), 'shield']
2
df.loc[('cobra', 'mark i'):'viper']
max_speed shield
cobra mark i 12 2
mark ii 0 4
sidewinder mark i 10 20
mark ii 1 4
viper mark ii 7 1
mark iii 16 36
df.loc[('cobra', 'mark i'):('viper', 'mark ii')]
max_speed shield
cobra mark i 12 2
mark ii 0 4
sidewinder mark i 10 20
mark ii 1 4
viper mark ii 7 1