关于python:只选择一个多索引DataFrame索引

Select only one index of multiindex DataFrame

我正在尝试使用多索引数据帧中的一个索引创建新的数据帧。

1
2
3
4
5
6
7
8
9
10
                   A         B         C
first second                              
bar   one     0.895717  0.410835 -1.413681
      two     0.805244  0.813850  1.607920
baz   one    -1.206412  0.132003  1.024180
      two     2.565646 -0.827317  0.569605
foo   one     1.431256 -0.076467  0.875906
      two     1.340309 -1.187678 -2.211372
qux   one    -1.170299  1.130127  0.974466
      two    -0.226169 -1.436737 -2.006747

理想情况下,我想要这样的东西:

1
In: df.ix[level="first"]

还有:

1
2
3
4
5
6
7
8
9
10
11
12
13
Out:

               A         B         C
first                              
bar        0.895717  0.410835 -1.413681
           0.805244  0.813850  1.607920
baz       -1.206412  0.132003  1.024180
           2.565646 -0.827317  0.569605
foo        1.431256 -0.076467  0.875906
           1.340309 -1.187678 -2.211372
qux       -1.170299  1.130127  0.974466
          -0.226169 -1.436737 -2.006747
`

本质上,我想删除除级别first之外的所有其他多个索引。有简单的方法吗?


一种方法是简单地将cx1[0]重新绑定到多索引的所需级别。可以通过指定要保留的标签名称来执行此操作:

1
df.index = df.index.get_level_values('first')

或者使用级别的整数值:

1
df.index = df.index.get_level_values(0)

所有其他级别的多重指数都将在这里消失。


该解决方案是全新的,使用df.xs函数作为

1
2
3
4
5
6
7
8
9
10
In [88]: df.xs('bar', level='first')
Out[88]:
Second  Third
one     A       -2.315312
        B        0.497769
        C        0.108523
two     A       -0.778303
        B       -1.555389
        C       -2.625022
dtype: float64

也可以使用多个索引作为

1
2
3
4
5
6
In [89]: df.xs(('bar', 'A'), level=('First', 'Third'))
Out[89]:
Second
one   -2.315312
two   -0.778303
dtype: float64

示例的设置如下

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
arrays = [
    np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
    np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])
]
index = pd.MultiIndex.from_tuples(list(zip(*arrays)), names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)
df.index.names = pd.core.indexes.frozen.FrozenList(['First', 'Second', 'Third'])
df = df.unstack()