如何从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
相关产品推荐
相关产品推荐

