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

如何在Pandas中将数据转成目标布局?已尝试stack和wide_to_long无效

Pandas 数据布局转换解决方案

情况1:日期列单元格包含多指标字符串

如果你的初始数据中,001.2023、002.2023这类日期列的单元格是包含Price、Discounts、Quantity的结构化字符串(比如"Price:100, Discounts:0.1, Quantity:50"),可以按以下步骤处理:

步骤1:构造示例初始数据

import pandas as pd

df_initial = pd.DataFrame({
    'Material': ['A', 'B'],
    'Category': ['Cat1', 'Cat2'],
    '001.2023': ['Price:100, Discounts:0.1, Quantity:50', 'Price:80, Discounts:0.15, Quantity:30'],
    '002.2023': ['Price:120, Discounts:0.05, Quantity:60', 'Price:90, Discounts:0.1, Quantity:40']
})

步骤2:宽表转长表并解析指标

# 将日期列转为行,得到长表结构
df_melted = df_initial.melt(id_vars=['Material', 'Category'], var_name='Date', value_name='Metrics')

# 解析Metrics字符串,拆分出三个指标列
def parse_metrics(metric_str):
    items = [item.split(':') for item in metric_str.split(',')]
    return pd.Series({k.strip(): float(v.strip()) for k, v in items})

df_melted[['Price', 'Discounts', 'Quantity']] = df_melted['Metrics'].apply(parse_metrics)

# 整理最终结果,调整列顺序并移除冗余列
df_final = df_melted.drop('Metrics', axis=1)[['Material', 'Date', 'Category', 'Price', 'Discounts', 'Quantity']]

# 可选:将Date格式转为标准年月格式(如'2023-01')
df_final['Date'] = pd.to_datetime(df_final['Date'], format='%d.%Y').dt.strftime('%Y-%m')

最终输出的df_final就是以Material、Date为维度,Price、Discounts、Quantity为列的目标布局。


情况2:日期与指标组合为列名(如001.2023_Price)

如果你的初始数据实际是每个日期对应三个指标列(列名格式为日期_指标),只是表述简化了,那么用wide_to_long可以快速解决,之前没成功可能是参数设置有误:

步骤1:构造示例初始数据

df_initial = pd.DataFrame({
    'Material': ['A', 'B'],
    'Category': ['Cat1', 'Cat2'],
    '001.2023_Price': [100, 80],
    '001.2023_Discounts': [0.1, 0.15],
    '001.2023_Quantity': [50, 30],
    '002.2023_Price': [120, 90],
    '002.2023_Discounts': [0.05, 0.1],
    '002.2023_Quantity': [60, 40]
})

步骤2:使用wide_to_long转换布局

df_final = pd.wide_to_long(
    df_initial,
    stubnames=['Price', 'Discounts', 'Quantity'],  # 指标前缀
    i=['Material', 'Category'],  # 保持不变的主键列
    j='Date',  # 拆分出的日期列名
    sep='_',  # 日期与指标的分隔符
    suffix=r'\d+\.\d+'  # 匹配日期格式的正则表达式
).reset_index()

# 可选:调整Date格式为标准年月
df_final['Date'] = pd.to_datetime(df_final['Date'], format='%d.%Y').dt.strftime('%Y-%m')

关键说明

  • 用stack未成功大概率是没先处理指标拆分步骤;wide_to_long失败则可能是stubnames、suffix参数与列名格式不匹配。
  • 若初始数据指标存储格式不同(如JSON、列表),可调整解析逻辑,核心思路都是先转长表,再拆分指标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:12:45