鉴于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
答案 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'
有关如何使用loc
和Indexing and Selecting Data的更多信息,请参阅文档。