如果我有一个多级列索引:
>>> 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
如果我有一个多级列索引:
>>> 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
当前回答
你可以使用multiindex . dropllevel:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
>>> df
a
b c
0 1 2
1 3 4
[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
>>> df
b c
0 1 2
1 3 4
[2 rows x 2 columns]
其他回答
你可以使用multiindex . dropllevel:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
>>> df
a
b c
0 1 2
1 3 4
[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
>>> df
b c
0 1 2
1 3 4
[2 rows x 2 columns]
一个使用level=1的sum的小技巧(当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
从Pandas 0.24.0开始,我们现在可以使用datafframe . dropllevel ():
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方法链滚动,这是非常有用的。
你也可以通过重命名列来实现:
df。列= ['a', 'b']
这涉及到一个手动步骤,但可能是一个选项,特别是如果你最终要重命名你的数据帧。
另一种方法是根据df的横截面重新分配df,使用.xs方法。
>>> 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