散点图报错:列表索引需为整数/切片而非浮点数,无法生成图表求助
问题原因与解决方案
错误根源
报错List indices must be integers or slices, not float的核心原因是:df.Monday.map(...)的返回结果中存在浮点数类型的NaN值。当原数据的Monday列有缺失值(空值),或者包含不在映射字典({"Monday":0,...,"Sunday":6})中的内容时,map()函数会返回NaN,而NaN属于浮点数类型,用它去索引sns.color_palette()生成的颜色列表就会触发类型错误。
修复方案
方案1:清理异常数据(推荐)
直接过滤掉Monday列中为空或不匹配映射规则的行,确保映射后结果全为整数:
# 过滤掉无效行(仅保留星期几的有效取值) valid_df = df[df.Monday.isin(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"])] # 生成整数类型的星期索引 day_indices = valid_df.Monday.map({"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3, "Friday": 4, "Saturday": 5, "Sunday": 6}).astype(int) # 同步过滤embedding(假设embedding与原DataFrame行一一对应) valid_embedding = embedding[valid_df.index] # 绘制散点图 plt.scatter( valid_embedding[:, 0], valid_embedding[:, 1], c=[sns.color_palette()[x] for x in day_indices] ) plt.gca().set_aspect('equal', 'datalim') plt.title('UMAP projection of the Uber dataset', fontsize=24);
方案2:保留异常数据并分配默认颜色
如果不想丢弃数据,给异常/缺失值分配一个默认整数索引,并扩展调色板:
day_mapping = {"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3, "Friday": 4, "Saturday": 5, "Sunday": 6} # 填充缺失值为7,强制转为整数类型 day_indices = df.Monday.map(day_mapping).fillna(7).astype(int) # 扩展调色板,给异常值添加灰色作为区分 color_palette = sns.color_palette() + ["#888888"] plt.scatter( embedding[:, 0], embedding[:, 1], c=[color_palette[x] for x in day_indices] ) plt.gca().set_aspect('equal', 'datalim') plt.title('UMAP projection of the Uber dataset', fontsize=24);
额外检查点
- 确认
df.Monday列的列名是否正确:从映射内容来看,这列应该是存储星期几的字段,可能实际列名并非Monday,而是day之类的名称,建议先打印df.columns确认列名匹配。
内容的提问来源于stack exchange,提问作者Anderson André
相关产品推荐
相关产品推荐

