2016-02-27 68 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 []参数。 –