如何从多索引数据框中返回多个级别/值组?

时间:2019-10-31 07:13:05

标签: python pandas dataframe multi-index

这是我的多索引数据框:

# Index Levels
outside = ['G1','G1','G1','G2','G2','G2']
inside = [1,2,3,1,2,3]
hier_index = list(zip(outside,inside))
hier_index = pd.MultiIndex.from_tuples(hier_index)
df = pd.DataFrame(np.random.randn(6,2),index=hier_index,columns=['A','B'])
df.index.names = ['Group','Num']
df

数据框如下所示:

                  A           B
Group   Num     
G1      1     0.147027  -0.479448
        2     0.558769   1.024810
        3    -0.925874   1.862864
G2      1    -1.133817   0.610478
        2     0.386030   2.084019
        3    -0.376519   0.230336

我要实现的是返回Group G1G2Num 13中的值像这样:

G1     1     0.147027   -0.479448
       3    -0.925874    1.862864
G2     1    -1.133817    0.610478
       3    -0.376519    0.230336

我尝试过

df.loc[['G1','G2']].loc[[1,3]]

但是什么也没显示。

然后我尝试了

df.xs([['G1','G2'],[1,3]]) 

但返回

  

TypeError:'([['G1','G2'],[1,3])'是无效的密钥。

有什么办法可以使它返回Group G1G2Num 13中的值?

3 个答案:

答案 0 :(得分:5)

作为.loc的替代方法,您还可以像这样使用query

df.query('Group in ["G1", "G2"] and Num in [1, 3]')

它还会返回:

                  A         B
Group Num                    
G1    1   -1.749477 -0.276759
      3    0.888542 -0.656236
G2    1    0.757631 -1.091000
      3   -1.203232  1.702107

如果您愿意,还可以在使用@的查询中使用参数,如果您的列表很长,这可能会派上用场:

num_sel = [1, 3]
df.query('Group in ["G1", "G2"] and Num in @num_sel')

产生相同的输出。

然后,您还可以轻松地在列条目中添加其他约束,例如A中的值必须大于0

df.query('Group in ["G1", "G2"] and Num in [1, 3] and A > 0')

返回

                  A         B
Group Num                    
G1    3    0.888542 -0.656236
G2    1    0.757631 -1.091000

答案 1 :(得分:4)

DataFrame.loc用于列表:

df1 = df.loc[(['G1','G2'], [1,3]), :]
print (df1)
                  A         B
Group Num                    
G1    1    2.165594  0.466762
      3    0.451996  0.125071
G2    1    2.783947  0.176145
      3    0.169508  0.071441

或使用slicers

idx = pd.IndexSlice
df1 = df.loc[idx[['G1','G2'], [1,3]], :]
print (df1)
                  A         B
Group Num                    
G1    1    0.617367 -1.010116
      3   -0.990257 -1.262942
G2    1    1.336134 -0.198787
      3   -0.310426  1.063520

答案 2 :(得分:1)

.loc的{​​{1}}索引方法将每个索引的级别作为参数:

pandas

由于您的数据框具有2个索引和1个列级别,因此df.loc[['G1','G2'], [1,3],:] 方法将使用3个参数,每个索引级别一个,列一个。

  

您可以使用documentation阅读更多内容。