72

例如,我有:

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

4 回答 4

95
df.reset_index(level=2, drop=True)
Out[29]: 
     A
1 1  8
  3  9
于 2013-06-13T10:43:36.060 回答
70

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

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

     A
1 1  8
  3  9

您还可以指定负索引,以便从末尾选择:

df.index = df.index.droplevel(-1)
于 2013-06-13T10:41:22.240 回答
10

如果您的索引具有类似的名称

       A
X Y Z
1 1 1  8
  3 2  9

然后你也可以通过指定索引名称来移除

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

于 2019-02-23T13:12:47.627 回答
1

从 0.24+ 开始,我们可以直接dropleveldf. 因此,要删除索引的最后一级:

>>> 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,即超过索引。可以通过提供列表一次删除多个级别,如果任何索引有名称,也可以使用这些名称(如链接文档中所示)。


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

>>> 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.

于 2021-06-17T11:30:45.813 回答