pandas实现按年气候宽表转换为带周数的按周长表的方法
pandas宽格式周气候数据表转长格式实现方案
你遇到的问题是列名同时包含指标名和周数后缀,直接全量pd.melt()会把所有列都转为行,无法自动拆分指标和周数,使用pd.wide_to_long()可以更便捷地实现需求。
示例转换效果
原始宽表结构
| region | year | precip1 | precip2 | max_temp1 | max_temp2 |
|---|---|---|---|---|---|
| 华北 | 2023 | 10.2 | 5.8 | 23.1 | 25.6 |
| 华东 | 2023 | 15.3 | 8.2 | 26.7 | 28.3 |
转换后长表结构
| region | year | Week | precip | max_temp |
|---|---|---|---|---|
| 华北 | 2023 | 1 | 10.2 | 23.1 |
| 华北 | 2023 | 2 | 5.8 | 25.6 |
| 华东 | 2023 | 1 | 15.3 | 26.7 |
| 华东 | 2023 | 2 | 8.2 | 28.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
相关产品推荐
相关产品推荐

