具有多索引的Pandas .loc子集方法

时间:2016-02-27 21:01:59

标签: python pandas

鉴于DataFrame,di,在这里创建:

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']

引发错误?

更新:2/29

在对文档进行一些挖掘之后,在我看来

di.loc['Gold','Biathlon',:] 
尽管在上面的示例中似乎有效,但

根本不支持语法。在调查MultiIndexes时,在用户尝试使用切片的情况下,我在带有多索引的DataFrame上遇到了note describing the importance of using the sort_index()。当我在di中对索引进行排序时,上面的语句现在会抛出错误。这告诉我,不支持以我在这里完成的方式使用三个选择参数。这是有道理的,因为它可能被模糊地解释。

e.g。

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

1 个答案:

答案 0 :(得分:1)

这是您的数据框,它有一个MultiIndex:

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

在数据框上使用.loc时,通常是行,列选择(即df.loc[row_indexer, column_indexer])。因此,在您的情况下,您选择的行是“金”和“金”。和'冬季两项'在索引中,':'表示所有列。

>>> 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:'密钥长度(3)超过索引深度(2)'

在数据框上使用loc时,单个参数将生成该索引点处数据的横截面,从而返回一个Series。

# 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的更多信息,请参阅文档。