如何使用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
相关产品推荐
相关产品推荐

