这是一个简单的pandas DataFrame,具有两级索引和单值列:
value
| k1 | k2 | |
+----+----+-------+
| a | b | c |
| d | e | f |
| g | h | i |
我可以使用k1选择行,如下所示:
df.loc[['a','d'], :]
并获得:
value
| k1 | k2 | |
+----+----+-------+
| a | b | c |
| d | e | f |
但是,当尝试使用k2时,就像那样:
df.loc[:, ['b','e']]
我得到了KeyError:" [[' b',' e']]都不在[columns]"
中我在这里缺少什么?
答案 0 :(得分:1)
你可以这样做:
df.loc[(slice(None), ['b', 'e']), :]
更详细的解释:
在执行df.loc[idx_row, idx_col]
时,索引器' idx_row' (在你的情况下,列表['a','d']
)索引行(所以你的多索引),而' idx_col' (在您的情况下为:
)索引列(在本例中为:所有列)
因此,您希望在行索引器中指定多索引的两个级别(' idx_row')。如果要从第二级别进行选择,则必须指定要使用切片包含第一级别的所有元素,因此' idx_row'变为(:, ['b', 'e'])
。唯一的问题是您无法在元组中使用:
,因此您需要使用等效的slice(None)
。
Pandas提供了一个小的解决方法,不必使用更详细的切片:
idx = pd.IndexSlice
df.loc[idx[:, ['b', 'e']], :]
请参阅相关文档:http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers