在Jupyter Notebook中设置Pivot Table实现多维度索引及门店销量求和
搞定多维度门店订单汇总与透视表索引调整
嘿,我来帮你解决这个pandas透视表的问题!先理清楚你的需求:要按STYLE(款号)、COLOR(颜色)、SIZE(尺码)三个维度,汇总每个门店的订单总数量,同时还要把原来的门店列(比如Store16、Store20这类)变成索引的一部分,而不是放在透视表的列上。
先明确数据结构前提
我假设你的原始数据df是这样的宽格式:每行对应一组STYLE-COLOR-SIZE,列是各个门店的订单数量,比如:
| STYLE | COLOR | SIZE | Store16 | Store20 | Store25 |
|---|---|---|---|---|---|
| S001 | Red | M | 10 | 5 | 3 |
| S001 | Red | L | 8 | 4 | 2 |
| S002 | Blue | S | 15 | 7 | 6 |
如果你的数据是这种结构,那咱们分两步走就能实现需求:
方法1:用melt转长格式 + pivot_table构建多层索引
第一步:把宽表转成窄表
原来的门店是列名,咱们得把它们转成数据里的一个字段,这样才能把它加入索引:
# 将STYLE/COLOR/SIZE保留为标识字段,把所有门店列转成"门店"字段,对应数量转成"订单数量" melted_df = df.melt( id_vars=['STYLE', 'COLOR', 'SIZE'], var_name='门店', value_name='订单数量' )
转完之后,数据就变成了每行对应STYLE-COLOR-SIZE-门店的组合,看起来像这样:
| STYLE | COLOR | SIZE | 门店 | 订单数量 |
|---|---|---|---|---|
| S001 | Red | M | Store16 | 10 |
| S001 | Red | M | Store20 | 5 |
| S001 | Red | M | Store25 | 3 |
第二步:构建带多层索引的透视表
现在就可以把STYLE、COLOR、SIZE、门店都设为索引,汇总订单数量:
result = pd.pivot_table( melted_df, index=['STYLE', 'COLOR', 'SIZE', '门店'], # 把门店加入索引,成为索引的一部分 values='订单数量', aggfunc='sum' # 按维度求和 )
方法2:用groupby更简洁实现
如果不需要透视表的额外功能(比如处理缺失值、多聚合函数),直接用groupby会更简单:
# 先转长表,再按四个维度分组求和 # 如果要保留多层索引,就去掉最后的reset_index() result = df.melt( id_vars=['STYLE', 'COLOR', 'SIZE'], var_name='门店', value_name='订单数量' ).groupby(['STYLE', 'COLOR', 'SIZE', '门店'])['订单数量'].sum().reset_index()
为什么你的初始代码没达到效果?
你原来写的df1 = pd.pivot_table(df, values=['Store16','...')是把门店列作为values,这样透视表会把门店放在列的位置,而不是索引里。咱们先转成窄表,就是为了把门店从“列名”变成“数据字段”,这样才能把它纳入索引体系,满足你“原列字段成为索引一部分”的需求。
最终示例结果
运行完上面的代码,你会得到这样的结果(多层索引版):
订单数量 STYLE COLOR SIZE 门店 S001 Red M Store16 10 Store20 5 Store25 3 L Store16 8 Store20 4 Store25 2 S002 Blue S Store16 15 Store20 7 Store25 6
内容的提问来源于stack exchange,提问作者WJ Zhao
相关产品推荐
相关产品推荐

