簡體   English   中英

無法使用 pandas groupby.apply 添加列

[英]Can't add a column by using pandas groupby.apply

最初我有下表:

df=pd.DataFrame(
    np.arange(4*8).reshape(4,8),
    index=list('abcd'),
    columns=pd.MultiIndex.from_arrays([list('EEEETTTT'), list('XXYYZZWW'), list('rsrsrsrs')] )
)

    E               T            
    X       Y       Z       W    
    r   s   r   s   r   s   r   s
a   0   1   2   3   4   5   6   7
b   8   9  10  11  12  13  14  15
c  16  17  18  19  20  21  22  23
d  24  25  26  27  28  29  30  31

我在( , ,'s')多索引列旁邊添加了一個名為'V'的新列,如下所示:

    E                     T                  
    X          Y          W          Z       
    r   s  V   r   s  V   r   s  V   r   s  V
a   0   1  0   2   3  0   6   7  0   4   5  0
b   8   9  0  10  11  0  14  15  0  12  13  0
c  16  17  0  18  19  0  22  23  0  20  21  0
d  24  25  0  26  27  0  30  31  0  28  29  0

我運行以下代碼以獲得上述結果:

dfl=[]
for name, x in df.groupby(level=[0, 1], axis=1):
    index = pd.IndexSlice
    x.loc[:,index[name[0],name[1],'V']]= 0
    dfl.append(x)

pd.concat(dfl, axis=1) 

現在我嘗試了以下“替代”方法來獲得相同的結果:

def f(x):
    idx = pd.IndexSlice
    x.loc[:, idx[x.name[0], x.name[1], 'V']]=0
    return x

df.groupby(level=[0,1], axis=1).apply(f)

然而,令我驚訝的是,結果表保持不變:

    E               T            
    X       Y       Z       W    
    r   s   r   s   r   s   r   s
a   0   1   2   3   4   5   6   7
b   8   9  10  11  12  13  14  15
c  16  17  18  19  20  21  22  23
d  24  25  26  27  28  29  30  31

pandas groupby.appy(func) 應該允許 func 返回任何大小甚至標量的數據幀。

這可能是一個錯誤嗎?

這是與MutiIndex in columnsMutiIndex in columns分組相關的部分錯誤

如果MultiIndex in index使用MultiIndex in index ,它會進行小的修改 - 刪除用於分組的級別以避免重復級別。

您的解決方案是通過轉置MultiIndex in index來修改的,應用函數並轉回:

def f(x):
    idx = pd.IndexSlice
    x.loc[idx[x.name[0], x.name[1], 'V'], :]=0
    x.index = x.index.droplevel([0,1])
    return x

df = df.T.groupby(level=[0,1], axis=0).apply(f).T.astype(int)
print (df)
    E                     T                  
    X          Y          W          Z       
    r   s  V   r   s  V   r   s  V   r   s  V
a   0   1  0   2   3  0   6   7  0   4   5  0
b   8   9  0  10  11  0  14  15  0  12  13  0
c  16  17  0  18  19  0  22  23  0  20  21  0
d  24  25  0  26  27  0  30  31  0  28  29  0

def f(x):
    idx = pd.IndexSlice
    x.loc[idx[x.name[0], x.name[1], 'V'], :]=0
    return x

df = df.T.groupby(level=[0,1], axis=0).apply(f).T.astype(int)
print (df)
    E                     T                  
    X          Y          W          Z       
    E          E          T          T       
    X          Y          W          Z       
    r   s  V   r   s  V   r   s  V   r   s  V
a   0   1  0   2   3  0   6   7  0   4   5  0
b   8   9  0  10  11  0  14  15  0  12  13  0
c  16  17  0  18  19  0  22  23  0  20  21  0
d  24  25  0  26  27  0  30  31  0  28  29  0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM