pandas透视表中的多重索引

0 投票
1 回答
598 浏览
提问于 2025-04-18 15:18

我正在制作一个数据透视表,长得像这样:

            Style  Site AVS  End Qty.                                          \
JP SIZE                           116  120  140  ADULTS  L  M  O  OSFA  S  XL   
0        50935801  2664   0         0    0    0       0  0  0  0     0  0   3   
1        50935801  2807   0         0    0    0       0  0  0  0     0  0   3   
2        50935801  2832   0         0    0    0       0  0  0  0     0  0   3   
3        50935802  2702   1         0    0    0       0  0  1  0     0  0   0   
4        50985101  2849   0         0    0    0       0  0  3  0     0  0   0   

            Sales Qty.                              
JP SIZE  Total         116  120  140  ADULTS  L  M      
0            3           0    0    0       0  0  0 ...  
1            3           0    0    0       0  0  0 ...  
2            3           0    0    0       0  0  0 ...  
3            1           0    0    0       0  0 -1 ...  
4            3           0    0    0       0  0  0 ...  

我希望只有一组列标题,内容是 [样式, 站点, AVS, 116, 120, ... , 总计, 销售数量]。

不过对于“销售数量”这一列,我希望现在表格里显示的内容能改成只有总计这一列(目前我可以通过 jj['销售数量']['总计'] 来访问这个数据,所以我想我可以把它存到另一个变量里,删除掉,然后最后再加上去)。

到目前为止我尝试的所有方法都没有成功,我觉得可能是因为我还不太理解 MultiIndex 是怎么工作的。

非常感谢你能提供的任何帮助!

1 个回答

0

可能有更聪明的方法,但一种做法是把多重索引当作一个元组的列表来处理,然后按照你描述的方式来映射新的列名。

def custom_rename(lvl1, lvl2):
    if lvl1 == 'End Qty.':
        return lvl2
    elif lvl1 == 'Sales Qty.' and lvl2 == 'Total':
        return 'Sales Qty.'
    elif lvl2 == '':
        return lvl1
    else:
        return '_'

接着对这些列进行操作并赋值:

df.columns = [custom_rename(lvl1, lvl2) for lvl1, lvl2 in df.columns]

'_'在这里是用来标记那些不再需要的列,所以最后一步就是把这些列删除掉。

df = df.drop('_', axis=1)

撰写回答