2016-02-27 29 views
2

以數據幀,di,所創造的一個子集:正確的方式將數據分配到multiindexed大熊貓數據幀

import pandas as pd 

data = { 
    "Event": ['Biathlon', 'Ski Jump', 'Slalom', 'Downhill'], 
    "Award": ['Gold', 'Bronze', 'Gold', 'Silver'], 
    "Points": ['100', '10', '100', '40'], 
    "Rank": ['1', '3', '1', '2'] 
} 

d = pd.DataFrame(data) 
di = d.set_index(["Award","Event"]) 
print(di) 

什麼會的是改變了('Bronze', 'Ski Jump')記錄點值的正確方法?

通過試驗和錯誤,我知道以下似乎工作,雖然我不清楚從pandas documentation這是一種可接受的方法。

di.loc[('Bronze', 'Ski Jump'), 'Points'] = 20 

那麼,你會如何處理呢?你能指點我的相關文件嗎?

回答

2

你說得對。從indexing docs(重點煤礦):

.loc主要是基於,但也可以用布爾陣列使用的標記。

當在DataFrame使用.loc,語法是

df.loc[row_indexer,column_indexer]

每個row_indexercolumn_indexer可以是

  • 單個標籤 [...]
  • 標籤['a', 'b', 'c']
  • 的列表或陣列的標籤切片對象'a':'f' [...]
  • 布爾矩陣

您是使用第一個項目符號點。你的行索引是一個多索引,其標籤是元組。你的列索引是一個普通的字符串索引。然後,表達

di.loc[('Bronze', 'Ski Jump'), 'Points'] 

翻譯爲「讓位於沿行的多指標('Bronze', 'Ski Jump')和沿列索引'Points'的價值。」這正是你想要的。


另一種方式來思考這個例子是忘了多指標。從MultiIndex/Advanced Indexing

這是值得牢記有什麼阻止你使用上的軸元組的原子標籤。

多索引與普通元組索引非常相似,雖然它提供了擴展功能(例如,只能使用第一級索引,如di.loc['Bronze'])。然而,實際上你可以創建自己的數據幀像

df = pd.DataFrame([ 
    ['100', '1'], 
    ['10', '3'], 
    ['100', '1'], 
    ['40', '2'] 
], columns=['Points', 'Rank'], index=[ 
    ('Gold', 'Biathlon'), 
    ('Bronze', 'Ski Jump'), 
    ('Gold', 'Slalom'), 
    ('Silver', 'Downhill') 
]) 

這使得它更加明顯,爲什麼di.loc[('Bronze', 'Ski Jump'), 'Points']是一個有效的標籤選擇。