Pandas处理GHCN气象数据:按站点日期分组将观测项转为列字段
Pandas长表转宽表高效实现方案
标准原生实现
你需要的长表转宽表操作属于pandas内置支持的典型场景,直接使用pivot方法即可完成,全程是向量化的C级实现,效率远高于手动编写Python循环,代码如下:
import pandas as pd # 长表转宽表核心逻辑 wide_df = df.pivot( index=['station', 'date'], # 作为行标识的列 columns='measurement', # 要展开为列的字段 values='value' # 填充到新列的数值字段 ).reset_index() # 可选:清除列名的冗余前缀 wide_df.columns.name = None
该方案完全符合pandas语法规范,相同硬件下处理速度是你现有循环方案的百倍以上,适合绝大多数中小规模数据集场景。
重复记录兼容方案
如果你的数据中存在同一个站点、同一个日期、同一个观测指标有多条记录的情况,直接使用pivot会报错,此时可以改用pivot_table指定聚合规则处理冲突:
wide_df = df.pivot_table( index=['station', 'date'], columns='measurement', values='value', aggfunc='first' # 可按需替换为mean、sum、max等聚合函数 ).reset_index() wide_df.columns.name = None
多核心并行处理方案
如果你的GHCN数据量极大(超过内存容量/单线程处理耗时过久),可以使用Dask框架实现并行处理,它的API和pandas高度兼容,会自动拆分任务到多CPU核心运行,还支持外存计算无需把全量数据加载到内存:
import dask.dataframe as dd # 直接用Dask读取原始CSV文件,无需提前加载为pandas DataFrame dask_df = dd.read_csv( '你的GHCN数据文件路径.csv', dtype={'station': str, 'date': int, 'measurement': str, 'value': float} ) # 转换逻辑和pandas完全一致 wide_dask = dask_df.pivot_table( index=['station', 'date'], columns='measurement', values='value', aggfunc='first' ).reset_index() # 执行计算得到pandas DataFrame(如果数据量过大也可以直接写入文件,无需加载到内存) wide_df = wide_dask.compute() # 直接写入文件的写法:wide_dask.to_csv('输出目录路径/*.csv', index=False)
内容的提问来源于stack exchange,提问作者fsperrle
相关产品推荐
相关产品推荐

