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. 帶有一個參數的可調用函數,返回可以用索引的結果。