Python 从多索引数据帧中删除列

Python 从多索引数据帧中删除列,python,pandas,Python,Pandas,考虑以下数据帧: arrays = [['foo', 'bar', 'bar', 'bar'], ['A', 'B', 'C', 'D']] tuples = list(zip(*arrays)) columnValues = pd.MultiIndex.from_tuples(tuples) df = pd.DataFrame(np.random.rand(4,4), columns = columnValues) print(df) foo

考虑以下数据帧:

arrays = [['foo', 'bar', 'bar', 'bar'],
      ['A', 'B', 'C', 'D']]
tuples = list(zip(*arrays))          
columnValues = pd.MultiIndex.from_tuples(tuples)
df = pd.DataFrame(np.random.rand(4,4), columns = columnValues)
print(df)
        foo       bar                    
          A         B         C         D
0  0.859664  0.671857  0.685368  0.939156
1  0.155301  0.495899  0.733943  0.585682
2  0.124663  0.467614  0.622972  0.567858
3  0.789442  0.048050  0.630039  0.722298
假设我要删除第一列,如下所示:

df.drop(df.columns[[0]], axis = 1, inplace = True)
print(df)
        bar                    
          B         C         D
0  0.671857  0.685368  0.939156
1  0.495899  0.733943  0.585682
2  0.467614  0.622972  0.567858
3  0.048050  0.630039  0.722298
这将产生预期的结果,但是保留列标签
foo
A

print(df.columns.levels)
[['bar', 'foo'], ['A', 'B', 'C', 'D']]
有没有一种方法可以从多索引数据框中完全删除列(包括其标签)

编辑:根据约翰的建议,我看了一下。我从中得到的是它不是一个bug,但是我相信建议的解决方案()对我不起作用。我是不是遗漏了什么

df2 = df.drop(df.columns[[0]], axis = 1)
print(df2)
        bar                    
          B         C         D
0  0.969674  0.068575  0.688838
1  0.650791  0.122194  0.289639
2  0.373423  0.470032  0.749777
3  0.707488  0.734461  0.252820

print(df2.columns[[0]])

MultiIndex(levels=[['bar', 'foo'], ['A', 'B', 'C', 'D']],
       labels=[[0], [1]])

df2.set_index(pd.MultiIndex.from_tuples(df2.columns.values))

ValueError: Length mismatch: Expected axis has 4 elements, new values have 3 elements
新答案 从0.20开始,
pd.MultiIndex
有一个方法


旧答案 我们的救星是pd.MultiIndex.to_系列()

它返回一系列限制在数据帧中的元组

df.columns = pd.MultiIndex.from_tuples(df.columns.to_series())

选中此复选框,如果您只是重新分配列,如
df2.columns=pd.MultiIndex.from_tuples(df2.columns.values)
?或者使用
df2.reindex(columns=pd.MultiIndex.from_tuples(df2.columns.values))
这样做有效!虽然感觉很不自然。。。你能不能把你的答复作为答复发出去,这样我就可以接受了?
df.columns = pd.MultiIndex.from_tuples(df.columns.to_series())