
本文详解如何正确对 CSV 中按日期分组的数值序列进行聚合,并将其安全、高效地转为 NumPy 数组(如 data_matrix),避免 KeyError: 'Số' 等常见错误,特别适用于时间序列预测(如 LSTM 输入准备)。
本文详解如何正确对 csv 中按日期分组的数值序列进行聚合,并将其安全、高效地转为 numpy 数组(如 `data_matrix`),避免 `keyerror: 'số'` 等常见错误,特别适用于时间序列预测(如 lstm 输入准备)。
在构建基于 LSTM 的时间序列预测模型时,常需将同一天的多个观测值(如每日 27 个数字)聚合成一个序列(Python list),再统一组织为二维 NumPy 数组:行代表日期,列代表当日各数值。但许多开发者在使用 pandas.groupby().apply() 后误操作列名或数据结构,导致 KeyError: 'Số' —— 根本原因并非列不存在,而是 apply() 返回的 Series 默认命名为 0,且 reset_index() 未显式指定新列名,致使原列 "Số" 消失。
✅ 正确做法是:用 df.groupby("Ngày")["Số"].apply(list) 直接对单列聚合,再通过 reset_index(name="Số") 显式恢复列名。该写法简洁、语义清晰,且自动处理类型(原始 Số 若为数值型,无需 map(int) 或 eval):
import numpy as np
import pandas as pd
# 读取并清洗列名(去除空格)
df = pd.read_csv("C:/Users/Admin/lonum_fixed.csv", encoding="utf-8", sep=",")
df.columns = df.columns.str.strip()
# ✅ 关键修正:单列聚合 + 显式命名
grouped_data = df.groupby("Ngày")["Số"].apply(list).reset_index(name="Số")
# ✅ 直接获取 NumPy object 数组(每个元素是 list)
data_matrix = grouped_data["Số"].values # 类型: numpy.ndarray(dtype=object)
# 若需进一步转为 float32 的二维数组(如 LSTM 输入 shape=(n_samples, 27)):
# data_2d = np.vstack(grouped_data["Số"].values).astype(np.float32)
⚠️ 注意事项:
-
groupby(...)[["Số"]](双括号)返回DataFrame,apply(...)作用于 DataFrame 会传入整个子表,易引发索引混乱;而groupby(...)["Số"](单括号)返回Series,apply(list)才真正对每组"Số"列值生成列表。 -
grouped_data["Số"].values返回np.ndarray,其元素为 Pythonlist,不是嵌套 NumPy 数组。若后续需统一 shape(如全部 27 个数),请先校验长度:assert all(len(lst) == 27 for lst in grouped_data["Số"])。 - 避免
eval()和map(int, ...):确保 CSV 中"Số"列已正确解析为数值类型(df["Số"].dtype应为int64或float64),可通过pd.read_csv(..., dtype={"Số": "int"})强制指定。
最终 data_matrix 是一个 object-type NumPy 数组,可直接用于构建序列数据集(例如滑动窗口切片),或通过 np.vstack() 转为标准二维数值矩阵供 LSTM 训练。此方法兼顾健壮性与可读性,是时间序列预处理中的推荐实践。










