从具有复合(分层)索引的 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'])

df 看起来和我们预期的一样:

在此处输入图像描述

如果 df 没有在 group1 上建立索引,我可以执行以下操作:

 df['group1' == 'a']

但是在这个带有索引的数据框上失败了。所以也许我应该将其视为具有层次索引的 Pandas 系列:

 df['a','c']

没有。那也失败了。

那么我如何选择所有行,其中:

  1. group1 == ‘a’
  2. group1 == ‘a’ & group2 == ‘c’
  3. 组 2 == ‘c’
  4. [‘a’,‘b’,‘c’] 中的组 1

原文由 JD Long 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 440
2 个回答

尝试使用 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

原文由 Wes McKinney 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 df.ix['a']
df.ix['a'].ix['c']

因为 group1group2 是索引。请原谅我之前的尝试!

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

 df.swaplevel(0,1).ix['c']

但我相信如果我错了,Wes 会纠正我。

原文由 Chris Fonnesbeck 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题