从pandas数据帧中删除多个多级别

时间:2017-10-19 14:42:20

标签: python pandas dataframe multi-index

给出以下示例:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                              'foo', 'bar', 'foo', 'foo'],
                       'B' : ['one', 'one', 'two', 'three',
                              'two', 'two', 'one', 'three'],
                       'C' : np.random.randn(8),
                       'D' : np.random.randn(8)})

def var1(x): return max(x)-min(x)
def var2(x): return (max(x)-min(x))/max(x)
def var3(x): return (max(x)-min(x))/ len(x)

df = df.groupby(['A','B']).agg({'C': var1, 'D': [var2, var3]})

df.columns = df.columns.droplevel()

output

但是df.columns = df.columns.droplevel()不是我想要的解决方案,因为我只能放弃一个级别。我想放弃这两个第一级。

修改

我已使用df.columns = df.columns.droplevel()

尝试了0,1,2..

我想要一个没有红细胞的df:

enter image description here

换句话说,我无法达到这个输出(一个简单的标题):

A   B       var1        var2        var3        
bar one     0.000000    -0.000000   0.000000
    three   0.000000    -0.000000   0.000000
    two     0.000000    -0.000000   0.000000
foo one     1.381629    -1.683335   0.582389
    three   0.000000    0.000000    0.000000
    two     0.636372    -0.031118   0.020791

1 个答案:

答案 0 :(得分:3)

使用:

df.columns = df.columns.droplevel()
df = df.rename_axis([None] * 2)
#or
#df.index.names = [None] * 2
print (df)
               var2      var3      var1
bar one   -0.000000  0.000000  0.000000
    three -0.000000  0.000000  0.000000
    two   -0.000000  0.000000  0.000000
foo one   -8.719019  0.461249  1.596351
    three  0.000000  0.000000  0.000000
    two    2.415974  0.558326  2.888277

但是可以添加列名,但这里只有一级列,所以只能标量:

df.columns.name = 'AB'
print (df)
AB             var2      var3      var1
bar one   -0.000000  0.000000  0.000000
    three -0.000000  0.000000  0.000000
    two    0.000000  0.000000  0.000000
foo one    0.469283  0.431255  0.164785
    three -0.000000  0.000000  0.000000
    two    0.967594  0.715657  0.827949