基于条件填充二维数组:热带气旋风速数据整理问询
问题:将热带气旋风速数据按单TC整理为二维数组
原始数据
import pandas as pd import numpy as np data = pd.DataFrame({ 'year': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2], 'TC_number': [0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0], 'maximum_wind_speed': [20.37199783, 21.2, 21.7, 14.626, 18.108, 21.4, 25.3, 25.3, 22.9, 18.108, 20.2, 22.1, 24.3, 25.5, 27.7, 29.8, 33.6, 36.7, 36.6, 35, 33, 29.7, 29, 20] })
需求
- 初始化一个
(1000, 240)的NumPy数组,每行对应**单个连续的热带气旋(TC)**的风速记录 - 240为单个TC最多可记录的风速数,不足记录的位置用
np.nan填充 - 当
TC_number与前一行不同时,切换到数组下一行填充
现有代码问题
原代码循环索引逻辑混乱,未正确追踪连续TC的分组,不仅无法正确写入数据,还会出现索引越界(如j=0时j-1=-1)等错误。
基于Pandas的解决方案
通过分组处理连续TC数据,高效完成数组填充:
# 1. 生成连续TC的分组ID:当TC_number变化时,分组ID递增 data['tc_group'] = (data['TC_number'] != data['TC_number'].shift(1)).cumsum() # 2. 按分组提取每个TC的风速数据,截断/补全到240个元素 tc_wind_data = data.groupby('tc_group')['maximum_wind_speed'].apply( lambda x: np.pad(x.values, (0, max(0, 240 - len(x))), mode='constant', constant_values=np.nan) ).tolist() # 3. 初始化输出数组并填充 output_array = np.full((1000, 240), np.nan) for idx, wind_row in enumerate(tc_wind_data): if idx >= 1000: break output_array[idx] = wind_row # 查看前6行的前6个元素(与预期输出匹配) print(np.round(output_array[:6, :6], 3))
代码说明
- 分组ID生成:利用
shift(1)对比当前行与前一行的TC_number,通过cumsum()生成唯一的连续TC分组ID,确保不同年份的同编号TC被视为独立分组。 - 数据补全/截断:对每个分组的风速数据,用
np.pad补全到240个元素(不足补np.nan,超过则截断前240个)。 - 数组填充:遍历分组后的风速数据,写入到
output_array对应行,最多填充1000行。
验证输出
[[20.372 21.2 21.7 14.626 nan nan] [18.108 21.4 25.3 25.3 22.9 nan] [18.108 20.2 22.1 24.3 nan nan] [25.5 27.7 29.8 33.6 nan nan] [36.7 36.6 35. nan nan nan] [33. 29.7 29. 20. nan nan]]
内容的提问来源于stack exchange,提问作者mathnoob
相关产品推荐
相关产品推荐

