
本文详解如何修复 KeyError: 'Số' 错误,正确将 Pandas 分组后的列表型列(如每日 27 个数字)转换为 NumPy 数组,确保数据格式兼容 LSTM 模型输入要求。
本文详解如何修复 `keyerror: 'số'` 错误,正确将 pandas 分组后的列表型列(如每日 27 个数字)转换为 numpy 数组,确保数据格式兼容 lstm 模型输入要求。
在使用 Pandas 对时间序列数据(如按“Ngày”分组)进行预处理以供 LSTM 模型训练时,一个常见需求是:将每个日期对应的多个数值(如每日 27 个“Số”)聚合为一个 Python 列表,并最终组织成形状为 (n_days, 27) 的 NumPy 数组。但若分组逻辑不当,极易触发 KeyError: 'Số' ——其根本原因并非列名不存在,而是 groupby().apply() 默认返回的 Series 或 DataFrame 未保留原始列名,导致后续 grouped_data["Số"] 查找失败。
✅ 正确做法:一步到位构建命名清晰的分组列表列
应避免嵌套 map(int, ...) 和 eval() 等冗余操作(原始数据中 "Số" 若已为数值类型,无需额外转换)。推荐使用简洁、语义明确的链式写法:
# 正确:直接对 "Số" 列应用 list 聚合,并通过 reset_index(name="Số") 显式指定新列名
grouped_data = df.groupby("Ngày")["Số"].apply(list).reset_index(name="Số")⚠️ 关键区别说明:
-
df.groupby("Ngày")[["Số"]]→ 返回 DataFrameGroupBy,.apply(...)后默认生成无名列(如0),故grouped_data["Số"]报错; -
df.groupby("Ngày")["Số"]→ 返回 SeriesGroupBy,.apply(list)输出 Series,再用.reset_index(name="Số")可精准命名新列,确保grouped_data["Số"]可安全访问。
✅ 高效获取 NumPy 数组:直接使用 .values
分组后,grouped_data["Số"] 是一个包含 list 元素的 Pandas Series。此时最高效、最稳妥的转数组方式是:
data_matrix = grouped_data["Số"].values # 返回 dtype=object 的 numpy.ndarray
该结果是一个 shape 为 (n_days,) 的 object 数组,每个元素为长度 27 的 Python list(例如 [6, 10, 18, 14])。这正是 LSTM 序列建模(如 shape=(batch, timesteps, features))所需的“样本列表”结构。
? 验证输出:
print(data_matrix[0])将显示类似list([6, 10, 18, 14]);若需进一步转为二维数值数组(如(n_days, 27)),可补充:# 前提:每组长度严格一致(如均为 27) data_2d = np.vstack(data_matrix) # shape: (n_days, 27)
⚠️ 注意事项与最佳实践
-
确保数据清洗前置:读取 CSV 后建议显式检查并转换类型:
df["Số"] = pd.to_numeric(df["Số"], errors="coerce") # 安全转数值,异常置 NaN df = df.dropna(subset=["Số"]) # 清理无效值
-
验证分组一致性:LSTM 要求每组样本数固定(如每日 27 个数),建议添加校验:
counts = df.groupby("Ngày")["Số"].count() if not (counts == 27).all(): raise ValueError(f"日期分组长度不一致:{counts.value_counts()}") -
避免
np.array(...tolist()):对含 list 的 Series 使用.tolist()再np.array()会生成 object 类型数组,且效率低于.values;而直接np.array(series)在新版 Pandas 中行为已优化,二者等价,但.values更直观、更稳定。
综上,核心修复仅需两行关键代码,即可消除 KeyError 并获得 LSTM 就绪的数据结构:先用 groupby(...)["Số"].apply(list).reset_index(name="Số") 构建命名正确的列表列,再用 .values 直接提取 object 数组。简洁、健壮、符合生产级数据预处理规范。

















