def test(): import pandas as pd 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) print(df) all = slice(None) print(df.loc[[all, "mark i"], :]) print(df.loc[(all, "mark i"), :])
上面代码中,传入列表[all, "mark i"]和传入元组(all, "mark i")的结果不一致。
其中,
df.loc中传入列表,相当于列表中的每一个元素都需要对df进行索引切片。第一个元素是all,这个all相当于匹配任何索引,所以所有的数据都打印出来了。传入元组,则相当与只使用元组执行一次切片。all相当于匹配索引的外层所有索引,“mark i"相当于匹配内层值为mark i的索引,最后打印的数据只有两个。
DataFrame.loc API
DataFrame.loc是纯粹基于标签的标签索引选择器。loc[]主要是基于标签的,但也可以与布尔数组一起使用。支持的传参格式:1. 一个单一的标签。比如5、‘g’.注意这里的5解释为索引中的一个标签,而不是沿着索引的整数位置。2. 标签构成的列表和数组。[‘a’, 'b', 'c']3. 标签组成的切片对象,比如 ‘a’: 'f' 。含头且含尾。4. 传入布尔数组5. 带有一个参数的可调用函数,返回可以用索引的结果。