
本文详解如何修复 KeyError: 'Số' 错误,正确将 Pandas 分组后的列表型列(如每日27个数字)转换为 NumPy 数组,确保数据结构兼容 LSTM 输入要求。
本文详解如何修复 `keyerror: 'số'` 错误,正确将 pandas 分组后的列表型列(如每日27个数字)转换为 numpy 数组,确保数据结构兼容 lstm 输入要求。
在使用 LSTM 进行时间序列预测(例如根据历史每日 27 个数值预测下一日序列)时,常需将原始 CSV 中按日期分组的数值聚合为「每行一个日期、每行值为该日所有数字组成的 Python 列表」的结构,并最终转为 NumPy 数组。但初学者易在 groupby().apply() 后误用列名,导致 KeyError: 'Số' ——根本原因在于:df.groupby("Ngày")[["Số"]].apply(...) 返回的是单列 DataFrame,其默认列名为 0,而非 "Số";而后续 grouped_data["Số"] 尝试访问不存在的列,从而报错。
✅ 正确做法:精简、语义清晰的分组聚合
应避免嵌套 map(int, ...) 和 eval() 等冗余操作(原始数据中 "Số" 列若已为数值类型,无需额外转换)。推荐使用以下一行式完成分组 → 转列表 → 重命名:
grouped_data = df.groupby("Ngày")["Số"].apply(list).reset_index(name="Số")
-
df.groupby("Ngày")["Số"]:直接选取分组键"Ngày"下的"Số"Series(非双层列表[["Số"]]),避免返回带整数列名的 DataFrame; -
.apply(list):对每个日期组内的"Số"值自动聚合成 Python 列表; -
.reset_index(name="Số"):重置索引并将结果列显式命名为"Số",确保列名可被安全引用。
✅ 安全获取 NumPy 数组:优先使用 .values
得到 grouped_data 后,无需 .loc[:, "Số"].tolist() 再套 np.array() ——这既低效又易出错(tolist() 会将嵌套列表展平为一维,破坏每日 27 维结构)。正确方式是:
data_matrix = grouped_data["Số"].values # 返回 dtype=object 的 numpy.ndarray,每个元素是一个 list
该结果是 numpy.ndarray,形状为 (n_days,),每个元素为长度 27 的 list(如 [6, 10, 18, 14, ...]),完全适配 LSTM 的 input_shape=(timesteps, features) 预处理需求(后续可通过 np.stack(data_matrix) 转为 (n_days, 27) 的二维数组)。
? 验证技巧:打印
grouped_data.dtypes和type(grouped_data["Số"].values)可确认列类型与数组类型是否符合预期。
⚠️ 注意事项与最佳实践
-
列名预处理务必到位:始终执行
df.columns = df.columns.str.strip(),防止"Số "或" Ngày"等隐藏空格导致分组失败; -
数据类型检查不可省略:运行
print(df.dtypes)确认"Số"列为int64或float64;若为object(含字符串),应在分组前统一转换:df["Số"] = pd.to_numeric(df["Số"], errors="coerce"); -
避免
eval()和map(int, ...):它们不仅性能差,还可能因空值或异常字符引发ValueError; -
LSTM 输入准备提示:
data_matrix是 object 类型数组,训练前通常需规整为(n_samples, 27)形状:X = np.stack(data_matrix) # shape: (n_days, 27) # 若需滑动窗口构造时序样本(如用前3天预测第4天),再使用 sklearn.preprocessing or manual slicing
通过以上方法,即可稳健、高效地构建适用于 LSTM 的分组序列数据矩阵,彻底规避 KeyError 并提升代码可维护性。










