Pandas pivot_table结果不符合预期,请求调整方案
解决Pandas透视表输出结构不符合预期的问题
我懂你的困扰——现在生成的透视表列层级是先按指标(CLICKTHRU/INTERACTION)分组,再按标签名称排列,但你想要的是先以BLAZE_TAG_NAME_DESC的标签为分组,每个标签下对应两个指标列,同时把PRODUCT作为普通列展示对吧?
咱们直接来调整代码,几步就能搞定:
完整解决方案代码
import pandas as pd import numpy as np raw_data = { 'PRODUCT': ['Display', 'InStream', 'Mobile'], 'BLAZE_TAG_NAME_DESC': ['enewsletter', 'get_the_guide', 'logo'], 'CLICKTHRU': [19,30,40], 'INTERACTION':[30,40,50]} df_a = pd.DataFrame(raw_data, columns = ['PRODUCT', 'BLAZE_TAG_NAME_DESC', 'CLICKTHRU','INTERACTION']) # 生成基础透视表(和你原来的代码一致) df_b = pd.pivot_table(df_a,index="PRODUCT",columns="BLAZE_TAG_NAME_DESC",values=['CLICKTHRU','INTERACTION'],aggfunc=np.sum,fill_value = 0) # 1. 交换列的层级:把标签名称移到列的第一层,指标移到第二层 df_b = df_b.swaplevel(axis=1) # 2. 对列排序,确保同一个标签下的两个指标相邻 df_b = df_b.sort_index(axis=1) # 3. 把PRODUCT从行索引转为普通列 df_b = df_b.reset_index() # 可选:如果想把多层列名合并成单一字符串(比如enewsletter_CLICKTHRU) df_b.columns = ['_'.join(col).strip() if col[0] != 'PRODUCT' else col[0] for col in df_b.columns.values] print(df_b)
关键步骤解释
swaplevel(axis=1):你的原始透视表列是[指标, 标签]的双层结构,这一步把它换成[标签, 指标],让每个标签下自然对应两个指标列。sort_index(axis=1):避免列出现交叉排列的情况,保证同一个标签的两个指标紧紧挨在一起。reset_index():把PRODUCT从行索引转成普通列,和你期望的输出结构对齐。- 合并列名(可选):如果不喜欢双层列名,可以把两层合并成一个带下划线的字符串,让输出更简洁。
执行后你会得到和预期一致的结果:
PRODUCT enewsletter_CLICKTHRU enewsletter_INTERACTION get_the_guide_CLICKTHRU get_the_guide_INTERACTION logo_CLICKTHRU logo_INTERACTION 0 Display 19 30 0 0 0 0 1 InStream 0 0 30 40 0 0 2 Mobile 0 0 0 0 40 50
内容的提问来源于stack exchange,提问作者DKM
相关产品推荐
相关产品推荐

