R语言中如何将Station.ID列重组为带标识的月份列(Spread/Reshape?)
解决方案:用Pandas重塑数据表(将Station.ID与月份列合并)
我来帮你搞定这个数据重塑的需求!下面用Python的Pandas库来实现——这是处理这类表格变换最便捷的工具,完全匹配你描述的需求:
步骤1:先模拟你的原始数据表
先构造一个和你描述一致的示例原表,方便你对照理解:
import pandas as pd # 模拟含多站点、多年份的原始数据 df = pd.DataFrame({ 'Station.ID': [323, 452, 323, 452], 'Year': [2020, 2020, 2021, 2021], 'Jan': [10.2, 15.5, 12.1, 16.3], 'Feb': [8.7, 13.2, 9.5, 14.1], 'Mar': [12.5, 17.8, 13.3, 18.5] })
原表结构大概是这样:
| Station.ID | Year | Jan | Feb | Mar |
|---|---|---|---|---|
| 323 | 2020 | 10.2 | 8.7 | 12.5 |
| 452 | 2020 | 15.5 | 13.2 | 17.8 |
| 323 | 2021 | 12.1 | 9.5 | 13.3 |
| 452 | 2021 | 16.3 | 14.1 | 18.5 |
步骤2:执行数据变换,生成目标表
通过「融化-重组」的两步操作,就能得到你想要的格式:
# 第一步:把所有月份列转成行,保留Station.ID和Year作为标识列 melted_df = df.melt(id_vars=['Station.ID', 'Year'], var_name='Month', value_name='Value') # 第二步:生成新列名(格式:月份_站点ID),再重新转回宽表 melted_df['New_Column'] = melted_df['Month'] + '_' + melted_df['Station.ID'].astype(str) result_df = melted_df.pivot(index='Year', columns='New_Column', values='Value')
步骤3:查看最终结果
执行完代码后,最终的表就是你期望的样子——以Year为索引,列名都是Jan_323、Feb_452这类带站点标识的月份字段:
| Year | Jan_323 | Jan_452 | Feb_323 | Feb_452 | Mar_323 | Mar_452 |
|---|---|---|---|---|---|---|
| 2020 | 10.2 | 15.5 | 8.7 | 13.2 | 12.5 | 17.8 |
| 2021 | 12.1 | 16.3 | 9.5 | 14.1 | 13.3 | 18.5 |
关键细节说明
- 不管你原表有多少个月份列(比如Apr、May...),这段代码都会自动处理所有非
Station.ID和Year的列,不用额外修改; - 把
Station.ID转成字符串是为了避免和月份名(字符串)拼接时出现类型错误; - 如果原表存在缺失值,
pivot会自动用NaN填充,你可以加.fillna(0)之类的方法按需处理。
内容的提问来源于stack exchange,提问作者SnowScience
相关产品推荐
相关产品推荐

