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

使用Pandas实现值与类别对应的数据转换难题

解决方案

先构造一个符合你描述的示例DataFrame,方便对应你的实际数据:

import pandas as pd

data = {
    '年份': [2023, 2023, 2023],
    '季度': ['Q1', 'Q2', 'Q3'],
    '地区': ['华东', '华东', '华南'],
    'Lower_stat_AA': [10, 12, 15],
    'Lower_range_AA': [5, 6, 7],
    'Lower_stat_BB': [8, 9, 11],
    'Lower_range_BB': [3, 4, 5],
    'Medium_stat_AA': [20, 22, 25],
    'Medium_range_AA': [10, 11, 12],
    'Medium_stat_BB': [18, 19, 21],
    'Medium_range_BB': [8, 9, 10],
    'Upper_stat_AA': [30, 32, 35],
    'Upper_range_AA': [15, 16, 17],
    'Upper_stat_BB': [28, 29, 31],
    'Upper_range_BB': [13, 14, 15]
}
df = pd.DataFrame(data)

接下来分两步实现数据重塑:

第一步:将宽表转为长表,拆分列名信息

用melt把所有统计相关的列转为行,然后拆分列名提取层级、统计类型、组别信息:

# 保留标识列,将其他列转为长表格式
melted_df = df.melt(id_vars=['年份', '季度', '地区'], var_name='指标', value_name='数值')

# 拆分指标列,得到层级、统计类型、组别
melted_df[['层级', '统计类型', '组别']] = melted_df['指标'].str.split('_', expand=True)

# 合并层级和统计类型,得到你需要的"Lower_stat"这类统计类型名称
melted_df['统计类型全称'] = melted_df['层级'] + '_' + melted_df['统计类型']

第二步:重塑为目标格式

用pivot将季度转为列,行索引设为地区、统计类型全称、组别:

result_df = melted_df.pivot(
    index=['地区', '统计类型全称', '组别'],
    columns='季度',
    values='数值'
).reset_index()

# 可选:按季度顺序整理列
result_df = result_df[['地区', '统计类型全称', '组别', 'Q1', 'Q2', 'Q3']]

运行后得到的result_df就是你要的格式:行维度为地区、统计类型(如Lower_stat)、组别,列维度为各个季度的统计数值。如果你的数据需要保留年份维度,只需将年份加入pivot的index参数即可。

之前用janitor的pivot_longer未得到目标输出,大概率是列名拆分的逻辑没匹配好,上述Pandas原生方法逻辑更直观,也便于调试调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:42:14