pandas 如何从多索引 Dataframe 中删除级别?

toe95027  于 2023-02-20  发布在  其他
关注(0)|答案(4)|浏览(165)

例如,我有:

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
rlcwz9us

rlcwz9us1#

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

5fjcxozz2#

您不需要创建新的DataFrame示例!您可以修改索引:

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

     A
1 1  8
  3  9

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

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

mftmpeh83#

如果索引的名称类似

A
X Y Z
1 1 1  8
  3 2  9

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

df.index = df.index.droplevel('Z')
2eafrhcq

2eafrhcq4#

从0.24+开始,我们可以直接在df上使用droplevel。因此,要删除索引的最后一级:

>>> df

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

>>> df.droplevel(-1)

       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属性并在那里选择positionally:

>>> 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返回一个新的 Dataframe ,因此需要使用df = df.droplevel(...)才能看到df中的更改。

相关问题