You need to enable JavaScript to run this app. pandas实现按年气候宽表转换为带周数的按周长表的方法
优惠活动
大模型
产品
解决方案
定价
更多

pandas实现按年气候宽表转换为带周数的按周长表的方法

pandas宽格式周气候数据表转长格式实现方案

你遇到的问题是列名同时包含指标名和周数后缀,直接全量pd.melt()会把所有列都转为行,无法自动拆分指标和周数,使用pd.wide_to_long()可以更便捷地实现需求。

示例转换效果

原始宽表结构

regionyearprecip1precip2max_temp1max_temp2
华北202310.25.823.125.6
华东202315.38.226.728.3

转换后长表结构

regionyearWeekprecipmax_temp
华北2023110.223.1
华北202325.825.6
华东2023115.326.7
华东202328.228.3

核心实现代码

import pandas as pd

long_df = pd.wide_to_long(
    df, # 替换为你的DataFrame变量名
    stubnames=["precip", "max_temp"], # 填写所有指标的前缀,如有其他指标按需添加
    i=["region", "year"], # 填写宽表中固定不变的唯一标识列,比如区域、年份
    j="Week", # 新生成的周数字段名
    suffix="\\d+" # 匹配列名后缀的数字规则,自动提取周数
).reset_index() # 将标识列从索引转回普通列

备选melt实现方案

如果需要自定义列名拆分逻辑,可以用pd.melt()配合正则提取实现:

# 先将所有指标列转为行
melted_df = df.melt(
    id_vars=["region", "year"], 
    var_name="raw_col", 
    value_name="value"
)
# 拆分列名提取指标名和周数
melted_df[["indicator", "Week"]] = melted_df["raw_col"].str.extract(r"([a-zA-Z_]+)(\d+)")
# 将指标名转为单独列
long_df = melted_df.pivot(
    index=["region", "year", "Week"], 
    columns="indicator", 
    values="value"
).reset_index().rename_axis(columns=None)

注意事项

  • stubnames参数需要列全所有需要转换的指标前缀,比如存在min_temp、wind_speed等指标都要加入列表
  • i参数需要填全宽表中不需要拆分的固定维度字段,避免转换后数据匹配错误
  • 后缀规则支持匹配任意长度的数字,周数为1位、2位(比如precip01)都可以正常识别

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 05:54:05