2016-02-27 69 views
0

,在這裏創建:大熊貓的.loc子集法考慮到數據幀,二multiindexes

import pandas as pd 

data = { 
    "Event": ['Biathlon', 'Ski Jump', 'Slalom', 'Downhill'], 
    "Award": ['Gold', 'Bronze', 'Gold', 'Silver'], 
    "Points": ['100', '10', '100', '40'] 
} 
d = pd.DataFrame(data) 
di = d.set_index(["Award","Event"]) 

爲什麼這個不執行的問題

di.loc['Gold','Biathlon',:] 

而這

di.loc['Gold','Biathlon','Points'] 

加薪一個錯誤?


UPDATE:2/29

在docs一些挖後,在我看來,

di.loc['Gold','Biathlon',:] 

是不是真的支持的語法可言,儘管出現在例如工作以上。在調查MultiIndexes時,在用戶試圖使用切片的情況下,我在DataFrames上遇到了帶有多索引的note describing the importance of using the sort_index()。當我對di中的索引進行排序時,上面的語句現在會拋出一個錯誤。這表明我不支持以我在這裏完成的方式使用三個選擇參數。這是有道理的,因爲它可以被模糊地解釋。

例如

di_isorted = di.sort_index() 
di_isorted.loc['Gold','Biathlon',:] #now throws an error 
+0

'Points'是數據系列的標題,而不是具有位置的東西。所以''''''Gold''''''''''''''應該可以工作。 – roadrunner66

+0

這不起作用 –

回答

1

這是你的數據框,其中有一個多指標:

   Points 
Award Event   
Gold Biathlon 100 
Bronze Ski Jump  10 
Gold Slalom  100 
Silver Downhill  40 

當您在數據框中使用.loc,它通常是一個行,列的選擇(即df.loc[row_indexer, column_indexer])。因此,對於您的情況,您在索引中選擇了'Gold'和'Biathlon'這一行,':'表示所有列。

>>> di.loc['Gold','Biathlon', :] 
       Points 
Award Event   
Gold Biathlon 100 

請注意,如果您傳遞參數作爲一個元組的結果將返回爲一個系列:

>>> di.loc[('Gold','Biathlon'), :] 
Points 100 
Name: (Gold, Biathlon), dtype: object 

嘗試使用.loc與你的語法(di.loc['Gold','Biathlon','Points'])導致一個錯誤,因爲你只在您的MultiIndex中有兩個級別,而您要求三個級別。

KeyError: 'Key length (3) exceeds index depth (2)'

當在數據幀用loc,一個參數將導致數據的在該索引點的橫截面,從而返回一個系列。

# or di.loc['Gold', 'Biathlon'] 
>>> di.loc[('Gold', 'Biathlon')] 
Points 100 
Name: (Gold, Biathlon), dtype: object 

因此,使用行,列選擇標準,根據您的選擇標準,在數據框中指定單個單元格。

>>> di.loc[('Gold', 'Biathlon'), 'Points'] 
'100' 

這相當於獲取數據at那個位置。

>>> di.at[('Gold', 'Biathlon'), 'Points'] 
'100' 

請參閱有關如何使用locIndexing and Selecting Data更多信息的文檔。

+0

我想我有點困惑的事實,包括一個切片機(如di.loc ['黃金','冬季兩項',:])表示要根據列進行選擇,同時包括列標籤(例如di.loc ['Gold','Biathlon','Points']會導致錯誤。根據文檔,單個標籤和切片器都不是有效的.loc []參數。 –