>>> df
a
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
>>> df
b c
0 1 2
1 3 4
0
您还可以通过重命名列来实现:
df.columns = ['a', 'b']
这涉及手动步骤,但可能是一个选项,特别是如果您最终将重命名您的数据框 .
0
删除索引的另一种方法是使用列表解析:
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
这是我在做一个groupby之后遇到的一个问题,并且需要一段时间才能找到解决它的this other question . 我在这里针对具体案例调整了解决方案 .
180
使用 sum 且level = 1的小技巧(当level = 1时的工作都是唯一的)
df.sum(level=1,axis=1)
Out[202]:
b c
0 1 2
1 3 4
更常见的解决方案 get_level_values
df.columns=df.columns.get_level_values(1)
df
Out[206]:
b c
0 1 2
1 3 4
6 回答
我一直在努力解决这个问题,因为我不知道为什么我的droplevel()函数不起作用 . 通过几个工作并了解表中的'a'是列名和'b','c'是索引 . 这样做会有所帮助
另一种方法是使用.xs方法根据
df
的横截面重新分配df
.您还可以通过重命名列来实现:
df.columns = ['a', 'b']
这涉及手动步骤,但可能是一个选项,特别是如果您最终将重命名您的数据框 .
删除索引的另一种方法是使用列表解析:
如果您想要组合两个级别的名称(如下面的示例,其中底层包含两个'y'),此策略也很有用:
删除顶层会留下两列,索引为“y” . 通过将名称与列表推导相结合可以避免这种情况 .
这是我在做一个groupby之后遇到的一个问题,并且需要一段时间才能找到解决它的this other question . 我在这里针对具体案例调整了解决方案 .
使用
sum
且level = 1的小技巧(当level = 1时的工作都是唯一的)更常见的解决方案
get_level_values
你可以使用MultiIndex.droplevel: