You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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 CarsSUV120
北京经销商Tesla CarsSEDAN90
............

如果需要嵌套字典结果

如果最终还是要嵌套字典(之前手动实现失败的场景),基于格式化后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:43:20