如何将含日期的宽格式降水DataFrame转换为长格式?
解决降水量DataFrame宽转长的问题
没问题,我来帮你搞定这个需求!要把以日份为列名的宽格式DataFrame转换成每个月份对应日份的长格式,用pandas的melt()函数就能轻松实现,还能保证顺序完全符合你的预期。
步骤详解
假设你的原始DataFrame结构大概是这样(每行对应一个月份,列是1到31的日份,值为对应日期的降水量):
| 月份 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 0 | 2023-01 | 0.5 | 0.0 | 1.2 |
| 1 | 2023-02 | 0.0 | 0.8 | 0.3 |
我们可以按以下步骤完成转换:
用
melt()实现宽表转长表
这个函数的核心作用就是把横向的列数据“融化”成纵向的行数据,我们只需要指定哪些列保持不变(比如月份),哪些列要转换成新的行维度(日份列)。修正日份的数据类型
日份列默认会是字符串类型,排序时会出现"10"排在"2"前面的混乱情况,所以要把它转成整数类型。按月份+日份排序
最后通过排序确保每个月份的日份是按数字顺序依次排列的。
完整代码示例
import pandas as pd # 替换成你自己的实际DataFrame precip_df = pd.DataFrame({ "月份": ["2023-01", "2023-02"], 1: [0.5, 0.0], 2: [0.0, 0.8], 3: [1.2, 0.3] }) # 核心转换逻辑 long_format_df = pd.melt( precip_df, id_vars="月份", # 保持不变的标识列(可以是单独月份或完整年月) value_vars=[col for col in precip_df.columns if col != "月份"], # 所有代表日份的列 var_name="日份", # 新生成的日份列名称 value_name="降水量" # 对应降水量值的列名称 ) # 转换日份为整数,避免字符串排序混乱 long_format_df["日份"] = long_format_df["日份"].astype(int) # 按月份和日份排序,得到预期的顺序 long_format_df = long_format_df.sort_values(by=["月份", "日份"]).reset_index(drop=True) print(long_format_df)
最终输出结果
运行后你会得到完全符合需求的长格式DataFrame:
| 月份 | 日份 | 降水量 | |
|---|---|---|---|
| 0 | 2023-01 | 1 | 0.5 |
| 1 | 2023-01 | 2 | 0.0 |
| 2 | 2023-01 | 3 | 1.2 |
| 3 | 2023-02 | 1 | 0.0 |
| 4 | 2023-02 | 2 | 0.8 |
| 5 | 2023-02 | 3 | 0.3 |
如果你的原始DataFrame里月份是单独的数字(比如1代表1月),只需要调整排序逻辑或者把月份和日份组合成完整日期即可,核心的melt()转换逻辑是通用的。
内容的提问来源于stack exchange,提问作者Vasker Sharma
相关产品推荐
相关产品推荐

