1 | 3 | 4
2 个评论
如果有一个DataFrame方法,对索引和列都能做到这一点,那就太好了。无论是删除还是选择索引级别。
@Sören Check out stackoverflow.com/a/56080234/3198568 . droplevel 的工作可以通过参数 axis 对多级索引或列进行工作。
python
pandas
David Wolever
David Wolever
发布于 2014-03-07
7 个回答
DSM
DSM
发布于 2018-02-18
已采纳
0 人赞同

你可以使用 MultiIndex.droplevel :

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
0  1  2
1  3  4
[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
0  1  2
1  3  4
[2 rows x 2 columns]
    
最好是明确地说明哪个级别被放弃。级别是以0为索引的,从顶部开始。【替换代码0
如果你要删除的索引在左边(行)而不是上面(列),你可以把 "列 "改为 "索引",并使用同样的方法。【替换代码0
在熊猫0.23.4版本中, df.columns.droplevel() 已不再可用。
@yoonghm 它是存在的,你可能只是在没有多索引的列上调用它。
我有三个层次的深度,想只降到中间的层次。我发现先降最低的(第2层),再降最高的(第0层),效果最好。【替换代码0
jxc
jxc
发布于 2018-02-18
0 人赞同

截止到熊猫 0.24.0 ,我们现在可以用 数据框.droplevel() :

cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
df = pd.DataFrame([[1,2], [3,4]], columns=cols)
df.droplevel(0, axis=1) 
#   b  c
#0  1  2
#1  3  4

如果你想保持你的DataFrame方法链的滚动,这非常有用。

这是 "最纯粹的 "解决方案,因为它返回一个新的DataFrame,而不是让它 "就地 "修改。
Guy
替换代码0】更明确,更容易理解
我将永远来到这里,因为我总是忘记设置 axis=1
这是正确的答案
Mint
Mint
发布于 2018-02-18
0 人赞同

另一种放弃索引的方法是使用列表理解。

df.columns = [col[1] for col in df.columns]
0  1  2
1  3  4

如果你想把两层的名字结合起来,这个策略也很有用,比如下面的例子中,底层包含两个 "Y"。

cols = pd.MultiIndex.from_tuples([("A", "x"), ("A", "y"), ("B", "y")])
df = pd.DataFrame([[1,2, 8 ], [3,4, 9]], columns=cols)
   A     B
   x  y  y
0  1  2  8
1  3  4  9

去掉顶层会留下两列索引为'y'的列。这可以通过用列表理解法连接名字来避免。

df.columns = ['_'.join(col) for col in df.columns]
    A_x A_y B_y
0   1   2   8
1   3   4   9

这是我在做完分组后遇到的一个问题,花了好长时间才找到。this other question这就解决了问题。我把这个解决方案改编为这里的具体案例。

[col[1] for col in df.columns] is more directly df.columns.get_level_values(1) .
有一个类似的需求,其中一些列有空的水平值。使用了以下方法。【替换代码0
spacetyper
spacetyper
发布于 2018-02-18
0 人赞同

另一种方法是根据 df 的横截面来重新分配 df ,使用 .xs method.

b c 0 1 2 1 3 4 >>> df = df.xs('a', axis=1, drop_level=True) # 'a' : key on which to get cross section # axis=1 : get cross section of column # drop_level=True : returns cross section without the multilevel index b c 0 1 2 1 3 4
这只有在整个列级有一个单一标签的情况下才有效。
当你想放弃第二层时,不工作。
如果你想对同一层次进行切割和放弃,这是一个不错的解决方案。如果你想在第二层(比如说 b )上进行分割,然后放弃该层,只留下第一层( a ),下面的方法就可以了。【替换代码2
sedeh
sedeh
发布于 2018-02-18
0 人赞同

你也可以通过重命名这些列来实现这一点。

df.columns = ['a', 'b']

这涉及到一个手动步骤,但可能是一个选择,特别是如果你最终会重命名你的数据框架。

这基本上就是Mint的第一个答案所做的。现在,也不需要指定名字的清单(一般来说这很繁琐),因为它是由 df.columns.get_level_values(1) 给你的。
BENY
BENY
发布于 2018-02-18
0 人赞同

一个使用 sum 的小技巧,级别=1(当级别=1时工作都是唯一的)。

df.sum(level=1,axis=1)
Out[202]: 
0  1  2
1  3  4
    
dhFrank
dhFrank
发布于 2018-02-18
0 人赞同