You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何需调用to_numpy()才能使loc赋值生效?KeyError报错解析

问题解析:KeyError: 0 与 pd.cut 返回值的差异

报错原因

你通过pd.read_csv('real_estate.csv', index_col=0)读取数据时,将原CSV的第一列(序号从1到414)设为了DataFrame的索引标签。这意味着real_estate的行索引是1、2、…、414,不存在索引为0的行。

而循环里for i in range(len(real_estate['X2 house age']))生成的是位置序号(从0开始的连续整数),real_estate.loc[i, 'X2 house age']中的loc是按索引标签匹配行的。第一次循环i=0时,找不到索引为0的行,因此抛出KeyError: 0。

同时,pd.cut()返回的是Series对象,它的索引与原DataFrame完全一致(1~414)。如果代码执行到buckets[i],i=0时同样会因为找不到对应索引报错,只是real_estate.loc的错误先被触发了。

为什么转成numpy数组后代码能正常运行?

调用.to_numpy()将Series转换为numpy数组后:

  1. 数组不再保留原索引信息,仅按位置序号存储数据,buckets[i]可以直接获取第i个位置的分箱结果,不会因为索引不匹配报错。
  2. 至于real_estate.loc[i,...]的问题,本质上是写法错误——loc是按索引标签取值,你的循环变量i是位置序号,正确的按位置赋值应该用iloc。之所以没报错,大概率是原数据索引为连续整数,Pandas在特定场景下的模糊匹配导致的,但这种写法不严谨。

更高效的正确写法

完全不需要循环,直接将分箱结果赋值给对应列即可(Pandas会自动按索引匹配):

import pandas as pd

real_estate = pd.read_csv('real_estate.csv', index_col=0)
# 直接替换原列的分箱结果
real_estate['X2 house age'] = pd.cut(real_estate['X2 house age'], 4, labels=False)

内容的提问来源于stack exchange,提问作者Allexj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:42:02