2017-05-30 73 views
1

我想知道为什么功能存在以按键访问多级索引序列的行,但它不存在于数据框中。pandas在多级索引数据框中选择行

例如,我有以下数据帧:

index_1 index_2 num_1 num_2 
0 a  c  1  2 
1 a  c  4  3 
2 a  c  3  4 
3 a  d  2  3 
4 b  d  3  1 
5 b  d  2  3 

我现在如下执行GROUPBY操作:

group_single_col = test.groupby(['index_1', 'index_2'])['num_1'].max() 

我没有问题做:

group_single_col[('a')] 

group_single_col[('a', 'c')] 

这是一个了不起的功能,允许我基于不同索引级别的值进行分片。

但是,如果我做一个GROUPBY并提取一个以上的列,如下所示:

group_double_col = test.groupby(['index_1', 'index_2'])[['num_1', 'num_2]].max() 

返回的对象是一个数据帧,虽然多级索引被实现,如操作

group_double_col[('a')] 

失败。

我知道在第一种情况下会返回一个序列,而在第二种情况下会返回一个数据帧,但我仍然认为该功能对数据框应该可以正常工作。

后续问题是,在数据框的情况下有什么解决方法?

目前我做的:

grouped[(grouped.index.get_level_values('index_1')=='a')] 

,但我的问题,如果有一个更有效的方法。

回答

3

您可以使用xs

print (group_double_col.xs('a', axis=0, level=0)) 
     num_1 num_2 
index_2    
c   4  4 
d   2  3 

print (group_double_col.xs('a', axis=0, level=0, drop_level=False)) 
       num_1 num_2 
index_1 index_2    
a  c   4  4 
     d   2  3 
+0

我才意识到你也可以这样做'group_double_col.reset_index()',然后切片像一个普通的数据帧。 – lhay86

+0

是的,这是另一种解决方案。这取决于你需要什么。因为如果用'索引'选择是非常快的。 – jezrael

相关问题