2017-01-17 44 views
2

我有以下DataFrame简单的大熊猫多指标切片

df_1 = DataFrame({ 
     "alpha" : [1,1,1,2,2,2,3,3,3] , 
     "beta" : [3,4,5,3,4,5,3,4,5] , 
     "val_1" : ["x", "y" , "z", "w", "a", "b", "v1" , "v2" , "v3" ] , 
     "val_2" : ["z1", "z2" , "z3", "w1", "w2", "w3" , "zz1" , "zz2" , "zz3" ] 
    }) 
df_1.set_index(["alpha", "beta"], inplace=True) 

我想选择以下突出显示的行:

enter image description here

也就是说,所有行上beta是3或5.

我已经多次浏览过熊猫文档,找不到方法去做这个。最接近我认为必须回答的是:

df_1.xs((3,5), level="beta", drop_level=False) 

现在哪个目前失败。什么是适当的索引/切片方式来获得这个?

+0

难道你不就是暴力吗?或者它的数据集很大? – Olian04

+1

在这个问题https://stackoverflow.com/questions/15463729/select-a-multiple-key-cross-section-from-a-dataframe他们解决基本上相同的问题,通过将其转换为“面板”。 – jdehesa

回答

4

您可以使用DF.query()方法基于指定的值子集:

df_1.query('beta == 3 or beta == 5') # More succintly : df_1.query('beta == [3,5]') 

enter image description here

+0

这真是太棒了。到目前为止,我已经避免了'query()'因为它被标记为“实验性”,但是说实话,这似乎比索引方法更直观。是否有任何理由不会一直使用'query()'(即性能等)? –

+1

AFAIK,与正常的布尔索引逻辑相比,当你有一个大尺寸的'DF'(可能是一百万行的顺序)时,'.query()'可以很有效率。而且,目前它缺少各种字符串处理功能。 –

2

另一种选择是使用get_level_valuesisin构建索引逻辑系列:

df_1[df_1.index.get_level_values(1).isin([3,5])] 

enter image description here

2

您可以使用pd.IndexSlice。文档中直接有一个very similar example

df_1.loc[pd.IndexSlice[:, [3,5]], :] 


      val_1 val_2 
alpha beta    
1  3  x z1 
     5  z z3 
2  3  w w1 
     5  b w3 
3  3  v1 zz1 
     5  v3 zz3 
+1

为了记录这个答案的变体:'df.loc [(slice(None),[3,5]),:]' – Boud