为了账号安全,请及时绑定邮箱和手机立即绑定

无法使用 pandas groupby.apply 添加列

无法使用 pandas groupby.apply 添加列

慕村9548890 2021-08-11 22:43:53
最初我有下表: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   sa   0   1   2   3   4   5   6   7b   8   9  10  11  12  13  14  15c  16  17  18  19  20  21  22  23d  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  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我运行以下代码以获得上述结果: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 xdf.groupby(level=[0,1], axis=1).apply(f)然而,令我惊讶的是,结果表保持不变:    E               T                X       Y       Z       W        r   s   r   s   r   s   r   sa   0   1   2   3   4   5   6   7b   8   9  10  11  12  13  14  15c  16  17  18  19  20  21  22  23d  24  25  26  27  28  29  30  31pandas groupby.appy(func) 应该允许 func 返回任何大小甚至标量的数据帧。这可能是一个错误吗?
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

这是与分组相关的部分错误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 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


查看完整回答
反对 回复 2021-08-11
  • 1 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信