如何使用第二个索引列从索引的pandas DataFrame中选择行?

时间:2015-04-14 08:33:48

标签: python pandas

这是一个简单的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]"

我在这里缺少什么?

1 个答案:

答案 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