Pandas:如何按索引将固定长度风向数据块替换为平均风向值
解决方案
核心思路:用groupby + transform实现分块替换
Pandas中处理这种固定大小分块的批量计算,最符合风格的方式是生成分组键后结合groupby.transform(),它能自动将分组计算的结果广播回原数据的长度,直接完成替换,完全不需要手动循环。
步骤1:优化风向平均函数(可选但推荐)
你原有的函数用了循环遍历,换成Numpy向量运算能大幅提升效率,同时修正角度转换的逻辑(原逻辑存在错误,比如会把90°转换成270°):
import numpy as np def hourly_wind_average(WD): # 将角度转为弧度,直接对整个Series做向量运算 rad = WD * np.pi / 180 # 计算东西/南北方向的分量总和 u_eastwest = np.sin(rad).sum() u_northsouth = np.cos(rad).sum() # 求平均分量 EW_avg = -u_eastwest / len(WD) NS_avg = -u_northsouth / len(WD) # 转换回角度并修正到0-360°范围 avg_WD = np.arctan2(EW_avg, NS_avg) * 180 / np.pi return avg_WD % 360
步骤2:分块替换风向值
假设你的风向列名为WD,执行以下代码即可完成每60行一组的替换:
# 生成分组键:每60行归为一组 group_keys = np.arange(len(df)) // 60 # 用transform计算每组的平均风向,并替换原列 df['WD'] = df['WD'].groupby(group_keys).transform(hourly_wind_average)
关键说明
np.arange(len(df)) // 60:生成一个和DataFrame行数相同的数组,每60个连续元素对应同一个分组编号(0,0,...,0,1,1,...,1...),实现固定大小分块。transform():和apply()不同,它会将分组计算的结果扩展为与原Series相同的长度,每个组内的所有元素都会被替换为该组的平均风向,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者liveFreeOrπHard
相关产品推荐
相关产品推荐

