如何用SQL或Python Pandas重构学校月度Cycle数据表格?
可行实现方案
一、SQL 实现方案(基于 CASE WHEN + GROUP BY)
如果之前用 CASE WHEN 没成功,大概率是分组逻辑或字段处理有问题,以下是正确写法:
假设原表名为 school_cycle,需注意:
- 确保每个
School+Month组合唯一,若有重复数据,需用聚合函数(如MAX()、MIN())取对应Cycle值 - 月份字段需是明确文本(如 'Jan'、'Feb')或可转换为对应文本的格式
SELECT School, MAX(CASE WHEN Month = 'Jan' THEN Cycle END) AS Jan, MAX(CASE WHEN Month = 'Feb' THEN Cycle END) AS Feb, MAX(CASE WHEN Month = 'Mar' THEN Cycle END) AS Mar, -- 按需求继续添加其他月份 Zone, -- 若需保留Zone字段,必须加入GROUP BY Code -- 若需保留Code字段,必须加入GROUP BY FROM school_cycle GROUP BY School, Zone, Code; -- 需包含所有非聚合字段
若同一学校同一月份有多条数据,根据业务需求选聚合函数:
- 取任意一个
Cycle值:用MAX()或MIN() - 合并所有值:用
GROUP_CONCAT(Cycle SEPARATOR ',')(MySQL)或STRING_AGG(Cycle, ',')(SQL Server)
二、Pandas 实现方案
Pandas 的 pivot 或 pivot_table 是处理这类行列转换的标准方法,具体步骤如下:
1. 基础用法(无重复数据)
如果每个 School + Month 组合唯一,直接用 pivot:
import pandas as pd # 读取Excel文件 df = pd.read_excel('your_file.xlsx') # 执行行列转换 pivoted_df = df.pivot( index=['School', 'Code', 'Zone'], # 作为行的字段,按需调整 columns='Month', # 作为列的字段 values='Cycle' # 填充单元格的字段 ).reset_index() # 移除列名层级,恢复常规格式 pivoted_df.columns.name = None # 保存结果到新Excel pivoted_df.to_excel('pivoted_result.xlsx', index=False)
2. 处理重复数据
若存在同一学校同一月份多条数据,用 pivot_table 配合聚合函数:
pivoted_df = pd.pivot_table( df, index=['School', 'Code', 'Zone'], columns='Month', values='Cycle', aggfunc='max', # 可选'min'、'first'、lambda x: ','.join(x)等 fill_value='' # 空值填充内容,按需设置 ).reset_index() pivoted_df.columns.name = None pivoted_df.to_excel('pivoted_result.xlsx', index=False)
三、Excel 原生功能实现(无需代码)
直接用Excel的「数据透视表」快速完成:
- 选中数据区域,点击「插入」→「数据透视表」
- 将「School」(可同时添加Code、Zone)拖到「行」区域
- 将「Month」拖到「列」区域
- 将「Cycle」拖到「值」区域,若有重复值,点击值字段设置,选择「最大值」「最小值」或「连接项」(Excel 2019及以上支持)
- 调整格式即可得到目标表格
内容的提问来源于stack exchange,提问作者Jav
相关产品推荐
相关产品推荐

