Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:从多级列索引中删除一个级别?_Python_Pandas - Fatal编程技术网

Python 熊猫:从多级列索引中删除一个级别?

Python 熊猫:从多级列索引中删除一个级别?,python,pandas,Python,Pandas,如果我有一个多级列索引: >>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")]) >>> pd.DataFrame([[1,2], [3,4]], columns=cols) A. ---+-- b|c --+---+-- 0 | 1 | 2 1 | 3 | 4 我如何才能降低该指数的“a”级,因此我最终得到: b | c --+---+-- 0 | 1 | 2 1 | 3 | 4 b|c

如果我有一个多级列索引:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
A. ---+-- b|c --+---+-- 0 | 1 | 2 1 | 3 | 4 我如何才能降低该指数的“a”级,因此我最终得到:

b | c --+---+-- 0 | 1 | 2 1 | 3 | 4 b|c --+---+-- 0 | 1 | 2 1 | 3 | 4 您可以使用:


您还可以通过重命名列来实现这一点:

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


这涉及到一个手动步骤,但可能是一个选项,尤其是当您最终要重命名数据帧时。

另一种方法是使用该方法基于
df
的横截面重新分配
df


另一种删除索引的方法是使用列表:

df.columns = [col[1] for col in df.columns]

   b  c
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

这是我做群比后遇到的一个问题,我花了一段时间才发现问题解决了。我将该解决方案应用于这里的具体情况。

我一直在努力解决这个问题,因为我不知道为什么我的droplevel()函数不起作用。完成几个步骤,了解表中的“a”是列名,“b”、“c”是索引。这样做会有帮助

df.columns.name = None
df.reset_index() #make index become label

使用
sum
和level=1的小技巧(level=1是唯一的)


更常见的解决方案
获取\u级别\u值

df.columns=df.columns.get_level_values(1)
df
Out[206]: 
   b  c
0  1  2
1  3  4

对于熊猫0.24.0,我们现在可以使用:


如果您希望保持数据帧方法链的滚动,这非常有用。

最好明确说明要删除哪个级别。级别从顶部开始为0索引
>>df.columns=df.columns.droplevel(0)
如果您试图删除的索引位于左侧(行)而不是顶部(列)侧,您可以将“columns”更改为“index”,并使用相同的方法:
>>df.index=df.index.droplevel(1)
在Panda版本0.23.4中,
df.columns.droplevel()
不再可用。@yoonghm它就在那里,你可能只是在没有多索引的列上调用它。我有三个级别,只想降到中间级别。我发现先降低最低(级别[2]),然后再降低最高(级别[0])效果最好<代码>>>>df.columns=df.columns.droplevel(2)>>>df.columns=df.columns.droplevel(0)这仅在整个列级别只有一个标签时有效。当您要删除第二个级别时不起作用。如果您要对同一级别进行切片和删除,这是一个很好的解决方案。如果您想在第二个级别(比如说
b
)上切片,然后删除该级别,剩下第一个级别(
a
),那么下面的方法就可以了:
df=df.xs('b',axis=1,level=1,drop_level=True)
最好有一个对索引和列都这样做的数据帧方法。删除或选择索引级别。@Sören签出
droplevel
works可以通过参数
axis
[col[1]for col in df.columns]
更直接地处理多级索引或列
df.columns.get_level_values(1)
。有类似的需求,其中一些列的级别值为空。使用了以下内容:
[col[0]如果col[1]=''else col[1]表示df.columns中的col]
这基本上就是Mint的第一个答案所做的。现在,也不需要指定名称列表(这通常很繁琐),因为它是由
df.columns.get_level_values(1)
提供给您的。这根本不会复制所需的输出。根据发布日期,您的版本中可能没有包含下降级别(2019年1月,它被添加到稳定版本24.0中)这是“最纯粹”的解决方案,因为返回新的数据帧而不是“就地”修改它。
df.droplevel(0,axis='columns')
更为明确和易于理解
df.columns = ['_'.join(col) for col in df.columns]

    A_x A_y B_y
0   1   2   8
1   3   4   9
df.columns.name = None
df.reset_index() #make index become label
df.sum(level=1,axis=1)
Out[202]: 
   b  c
0  1  2
1  3  4
df.columns=df.columns.get_level_values(1)
df
Out[206]: 
   b  c
0  1  2
1  3  4
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