使用Pandas处理Excel特定矩阵的Unpivot格式转换问题
用Pandas重塑函数解决数据格式转换问题
别折腾手动嵌套字典了,Pandas原生的**重塑函数(melt/stack)**是解决这类宽转长格式问题的最优方案,效率高还不容易出错。以下是具体实现逻辑:
先明确数据结构(模拟常见场景)
假设你的原始未格式化DataFrame是宽格式:行是「品牌+车型」的复合标识,列是各地经销商,单元格是对应数据(比如销量/库存):
import pandas as pd # 模拟你的原始数据 raw_df = pd.DataFrame({ '品牌车型': ['Tesla Cars_SUV', 'Tesla Cars_SEDAN', 'Tesla Cars_TRUCK', 'Toyota Cars_SUV', 'Toyota Cars_SEDAN', 'Toyota Cars_TRUCK'], '北京经销商': [120, 90, 40, 210, 150, 70], '上海经销商': [150, 110, 50, 240, 180, 80], '广州经销商': [90, 70, 30, 180, 130, 60] })
步骤1:拆分品牌与车型列(如果原始是复合标识)
如果品牌和车型合并在同一列,先拆分生成独立字段:
# 拆分品牌和车型,生成两列 raw_df[['品牌', '车型']] = raw_df['品牌车型'].str.split('_', expand=True) # 删除原复合列 raw_df = raw_df.drop('品牌车型', axis=1)
步骤2:转成规范格式(经销商、品牌、车型对应值)
用melt函数把宽格式转成你需要的长格式:
# 重塑数据:将经销商列转为行,生成规范结构 formatted_df = raw_df.melt( id_vars=['品牌', '车型'], # 保留作为标识的列 var_name='经销商', # 原列名(经销商)转为新列的名称 value_name='数据值' # 原单元格数值转为新列的名称 ) # 调整列顺序为你需要的「经销商、品牌、车型、数据值」 formatted_df = formatted_df[['经销商', '品牌', '车型', '数据值']]
执行后得到的formatted_df就是规范格式:
| 经销商 | 品牌 | 车型 | 数据值 |
|---|---|---|---|
| 北京经销商 | Tesla Cars | SUV | 120 |
| 北京经销商 | Tesla Cars | SEDAN | 90 |
| ... | ... | ... | ... |
如果需要嵌套字典结果
如果最终还是要嵌套字典(之前手动实现失败的场景),基于格式化后的DataFrame转换更稳妥:
# 生成「经销商 -> 品牌 -> 车型 -> 数据值」的嵌套字典 result_dict = formatted_df.groupby('经销商').apply( lambda x: x.groupby('品牌').apply( lambda y: y.set_index('车型')['数据值'].to_dict() ).to_dict() ).to_dict()
为什么手动嵌套字典容易失败?
手动遍历DataFrame构造嵌套字典时,很容易忽略索引对齐、空值处理、列名大小写/空格等细节,而且效率远低于Pandas的C语言实现的原生函数。先转成规范的长格式DataFrame,再按需转换是更可靠的思路。
内容的提问来源于stack exchange,提问作者ThelearningPepe
相关产品推荐
相关产品推荐

