为何需调用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数组后:
- 数组不再保留原索引信息,仅按位置序号存储数据,
buckets[i]可以直接获取第i个位置的分箱结果,不会因为索引不匹配报错。 - 至于
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
相关产品推荐
相关产品推荐

