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

如何从Pandas DataFrame快速生成RNN/LSTM模型训练序列?

高效生成RNN序列:优化20万+ID的Pandas数据处理

你的问题核心是循环遍历每个ID做切片操作导致的性能瓶颈——每次df[df['id'] == idx]都会触发全表扫描,20万次循环下来耗时极高,而且频繁的DataFrame切片和列表转换也会浪费内存。以下是两种远快于原方法的优化方案:

方案1:使用Pandas GroupBy(安全且高效)

利用Pandas内置的分组优化操作,避免手动循环:

import numpy as np
import pandas as pd

def create_sequence_data_groupby(df, num_features, y_label='y'):
    # 按ID分组,提取特征列并转为numpy数组
    grouped_features = df.groupby('id')[num_features].apply(lambda g: g.values)
    # 将每个组的二维数组合并为三维数组(样本数 × 时间步 × 特征数)
    x_sequence = np.stack(grouped_features.values)
    
    # 直接分组取y的最大值
    y_local = df.groupby('id')[y_label].max().values
    # 获取唯一ID列表
    ids = grouped_features.index.values
    
    return x_sequence, y_local, ids

优势:

  • GroupBy是Pandas底层优化过的操作,比手动循环快10~100倍
  • 自动处理每个ID的行数(即使个别ID行数有波动也能兼容)
  • 输出的x_sequence是标准的三维numpy数组,可直接输入RNN模型

方案2:使用Numpy Reshape(极致性能)

如果你的数据严格保证每个ID对应33行且已按ID+时间排序,可以直接用numpy的reshape操作,完全避开分组开销:

import numpy as np

def create_sequence_data_reshape(df, num_features, y_label='y'):
    # 将特征列转为numpy数组
    features_arr = df[num_features].values
    # 固定每个序列的长度
    seq_length = 33
    # 直接reshape为三维数组:(总ID数, 时间步, 特征数)
    x_sequence = features_arr.reshape(-1, seq_length, features_arr.shape[1])
    
    # 处理y标签:reshape后取每个ID的最大值
    y_arr = df[y_label].values.reshape(-1, seq_length)
    y_local = y_arr.max(axis=1)
    
    # 提取唯一ID:每33行取第一个即可
    ids = df['id'].values[::seq_length]
    
    return x_sequence, y_local, ids

优势:

  • 性能最优:reshape是numpy的视图操作(几乎不占用额外内存),速度比GroupBy还快数倍
  • 代码极简,无复杂分组逻辑

注意事项

  • 如果存在ID行数不等于33的情况,优先用GroupBy方案,Reshape会出错
  • 提前将DataFrame转为numpy数组(df.values)能进一步减少Pandas的开销
  • 输出的x_sequence已经是RNN模型需要的三维格式(无需再转列表)

内容的提问来源于stack exchange,提问作者Andre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:31:19