2017-10-19 44 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