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

