2017-10-19 68 views
0

给下面的例子:下降几个多从熊猫数据框中

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()不是我想要的,因为我只能降一个级别的解决方案。我想放弃这2个第一关。

编辑

我已经尝试过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 
+0

和'df.columns = df.columns.droplevel (0)'? – jezrael

+0

或者'df.columns = df.columns.levels [1]'? – Zero

+0

我不能得到我想要的,你必须注意到我仍然有“2级”,并且输出结果不是我在目标解决方案“打印的” – PeCaDe

回答

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 
+0

你试过了你的建议吗?这是在我自己的问题,它没有工作,以得到我所要求的.. – PeCaDe

+0

当然,对我来说,它的工作很好... – jezrael

+0

我尝试你的解决方案,对我来说也是:( – jezrael