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

如何使用Pandas实现宽表转长表并将值转换为对应列

Pandas宽表转长表实现方案

你当前的代码存在逻辑偏差:原始数据集没有date字段,Q122/Q222/Q322这些列名本身就是需要提取的date维度值,直接将id和date设为索引会触发字段不存在的报错,你可以用以下两种方案实现需求:

方案1:使用pd.melt实现(更直观,推荐)

pd.melt是Pandas专门用于宽表转长表的接口,代码如下:

import pandas as pd

# 构造示例数据,你可以替换为自己的读表逻辑
df = pd.DataFrame({
    "id": ["aa", "aa", "aa", "aa"],
    "type": ["hi", "hello", "ok", "bye"],
    "Q122": [4, 2, 6, 1],
    "Q222": [6, 3, 8, 1],
    "Q322": [7, 3, 9, 1]
})

# 宽转长核心逻辑
res = df.melt(
    id_vars=["id", "type"],  # 不需要转换、保持固定的列
    var_name="date",         # 原列名转换后对应的字段名
    value_name="count"       # 原单元格值转换后对应的字段名
)

# 按date排序,和你期望的输出顺序保持一致
res = res.sort_values("date", ignore_index=True)

方案2:基于stack逻辑调整实现

如果你想要沿用你之前尝试的stack写法,只需要调整索引设置顺序即可:

res = df.set_index(["id", "type"])  # 先固定id和type为行索引
        .rename_axis(columns="date")# 给列索引起名为date
        .stack()                    # 将列索引转为行索引
        .reset_index(name="count")  # 把所有索引转为普通列,值列命名为count

# 同样可加排序对齐期望输出
res = res.sort_values("date", ignore_index=True)

两种方案运行后得到的结果都和你给出的期望输出完全一致。

内容的提问来源于stack exchange,提问作者Lynn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:06:07