You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于条件填充二维数组:热带气旋风速数据整理问询

问题:将热带气旋风速数据按单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))

代码说明

  1. 分组ID生成:利用shift(1)对比当前行与前一行的TC_number,通过cumsum()生成唯一的连续TC分组ID,确保不同年份的同编号TC被视为独立分组。
  2. 数据补全/截断:对每个分组的风速数据,用np.pad补全到240个元素(不足补np.nan,超过则截断前240个)。
  3. 数组填充:遍历分组后的风速数据,写入到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:15:11