猿问

无法使用 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

我添加一个名为'V'next( , ,'s')多索引列的新列,如下所示:


    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 返回任何大小甚至标量的数据帧。


这可能是一个错误吗?


慕村9548890
浏览 210回答 1
1回答

aluckdog

这是与分组相关的部分错误MutiIndex in columns。如果使用MultiIndex in index,它会进行小的修改 - 删除用于分组的级别以避免重复级别。您的解决方案通过 transpose for MultiIndex in index、apply function 和 transpose back 修改: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 xdf = 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  Va   0   1  0   2   3  0   6   7  0   4   5  0b   8   9  0  10  11  0  14  15  0  12  13  0c  16  17  0  18  19  0  22  23  0  20  21  0d  24  25  0  26  27  0  30  31  0  28  29  0def f(x):    idx = pd.IndexSlice    x.loc[idx[x.name[0], x.name[1], 'V'], :]=0    return xdf = 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  Va   0   1  0   2   3  0   6   7  0   4   5  0b   8   9  0  10  11  0  14  15  0  12  13  0c  16  17  0  18  19  0  22  23  0  20  21  0d  24  25  0  26  27  0  30  31  0  28  29  0
随时随地看视频慕课网APP

相关分类

Python
我要回答