使用复合(分层)索引从Pandas数据框中选择行

JD *_*ong 33 python multi-index dataframe pandas

我怀疑这是微不足道的,但我还没有发现让我根据分层键的值从Pandas数据帧中选择行的咒语.因此,例如,假设我们有以下数据帧:

import pandas
df = pandas.DataFrame({'group1': ['a','a','a','b','b','b'],
                       'group2': ['c','c','d','d','d','e'],
                       'value1': [1.1,2,3,4,5,6],
                       'value2': [7.1,8,9,10,11,12]
})
df = df.set_index(['group1', 'group2'])
Run Code Online (Sandbox Code Playgroud)

看起来像我们期望的那样:

在此输入图像描述

如果df未在group1上编入索引,我可以执行以下操作:

df['group1' == 'a']
Run Code Online (Sandbox Code Playgroud)

但是这个带有索引的数据帧失败了.所以也许我应该把它想象成一个带有分层索引的Pandas系列:

df['a','c']
Run Code Online (Sandbox Code Playgroud)

不.那也失败了.

那么如何选择所有行:

  1. group1 =='a'
  2. group1 =='a'&group2 =='c'
  3. group2 =='c'
  4. group1 in ['a','b','c']

Wes*_*ney 49

尝试使用xs非常精确:

In [5]: df.xs('a', level=0)
Out[5]: 
        value1  value2
group2                
c          1.1     7.1
c          2.0     8.0
d          3.0     9.0

In [6]: df.xs('c', level='group2')
Out[6]: 
        value1  value2
group1                
a          1.1     7.1
a          2.0     8.0
Run Code Online (Sandbox Code Playgroud)

  • df [[group1 in ['a','b','c'] for group1,group2 in df.index]] (3认同)

Chr*_*eck 9

像下面这样的语法将起作用:

df.ix['a']
df.ix['a'].ix['c']
Run Code Online (Sandbox Code Playgroud)

因为group1group2是指数.请原谅我以前的尝试!

要仅获得第二个索引,我认为你必须交换索引:

df.swaplevel(0,1).ix['c']
Run Code Online (Sandbox Code Playgroud)

但我相信如果我错了,韦斯会纠正我.