如何从多索引数据框中删除级别?

时间:2013-06-13 10:17:57

标签: pandas dataframe multi-index

例如,我有:

In [1]: df = pd.DataFrame([8, 9],
                          index=pd.MultiIndex.from_tuples([(1, 1, 1),
                                                           (1, 3, 2)]),
                          columns=['A'])

In [2] df
Out[2]: 
       A
1 1 1  8
  3 2  9

是否有更好的方法从索引中删除最后一个级别:

In [3]: pd.DataFrame(df.values,
                     index=df.index.droplevel(2),
                     columns=df.columns)
Out[3]: 
     A
1 1  8
  3  9

4 个答案:

答案 0 :(得分:62)

df.reset_index(level=2, drop=True)
Out[29]: 
     A
1 1  8
  3  9

答案 1 :(得分:51)

您无需创建新的DataFrame实例!您可以修改索引:

df.index = df.index.droplevel(2)
df

     A
1 1  8
  3  9

您还可以指定负指数,以便从末尾进行选择:

df.index = df.index.droplevel(-1)

答案 2 :(得分:4)

如果您的索引具有

之类的名称
       A
X Y Z
1 1 1  8
  3 2  9

然后,您还可以通过指定索引名称来删除

df.index = df.index.droplevel(Z)

答案 3 :(得分:0)

从 0.24+ 开始,我们可以直接在 dfadjacent sibling combinator。因此,要删除索引的最后一级:

>>> df

         col
1 5 1 4  foo
  3 2 8  bar
2 4 3 7  saz

# `axis` defaults to `index` or equivalently 0

>>> df.droplevel(-1, axis="index")

       col
1 5 1  foo
  3 2  bar
2 4 3  saz

水平下降的轴也可以用 axis 参数控制,默认为 0,即超过索引。可以通过提供列表一次删除多个级别,如果任何索引有名称,也可以使用这些名称(如链接文档中的示例)。


注意:droplevel 的参数试图首先被解释为标签;因此,如果任何级别碰巧有一个整数名称,它将被删除,即,不在位置上:

>>> df
                 col
this -1 other 0
1    5  1     4  foo
     3  2     8  bar
2    4  3     7  saz


# literally drops `-1` level
>>> df.droplevel(-1)

              col
this other 0
1    1     4  foo
     2     8  bar
2    3     7  saz

# literally level `0` is dropped
>>> df.droplevel(0)

               col
this -1 other
1    5  1      foo
     3  2      bar
2    4  3      saz

为了确保发生位置下降,我们可以使用 names 属性并在那里选择位置:

>>> df
                 col
this -1 other 0
1    5  1     4  foo
     3  2     8  bar
2    4  3     7  saz

# go get the name of the last level, drop whatever it is
>>> df.droplevel(df.index.names[-1])

               col
this -1 other
1    5  1      foo
     3  2      bar
2    4  3      saz

# similarly...
>>> df.droplevel(df.index.names[0])

            col
-1 other 0
5  1     4  foo
3  2     8  bar
4  3     7  saz

最后,droplevel 返回一个新的数据帧,因此需要 df = df.droplevel(...) 才能看到 df 中的变化。