使用Pandas的loc方法为何会在DataFrame中新增NaN行?
问题原因及解决方法
核心问题:混淆了标签索引与位置索引
你读取数据时用了index_col=0,这导致DataFrame的索引是原CSV第一列的自定义值(该数据集的索引是从1到414的连续整数),但循环中你用range(len(real_estate['X2 house age']))生成的是0到413的整数——这些值里有一部分(比如0)并不存在于原DataFrame的索引中。
而pandas的loc是标签索引,当你使用一个不存在的索引标签(比如0)去赋值时,它会自动新增一行对应索引的记录,只给指定列赋值,其他列自然就是NaN。这就是你看到末尾出现NaN行的原因。
两种解决办法
1. 改用位置索引(仅作逻辑理解,不推荐)
如果一定要保留循环逻辑,把loc换成iloc(位置索引),它按行/列的位置序号操作,和你的循环变量i匹配:
import pandas as pd real_estate = pd.read_csv('real_estate.csv', index_col=0) buckets = pd.cut(real_estate['X2 house age'], 4, labels=False).to_numpy() # 获取目标列的位置索引 col_idx = real_estate.columns.get_loc('X2 house age') for i in range(len(real_estate)): real_estate.iloc[i, col_idx] = buckets[i]
2. 直接赋值(推荐,符合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)
这种方式既高效又避免了索引混淆的问题,还省去了转numpy数组的步骤。
内容的提问来源于stack exchange,提问作者Allexj
相关产品推荐
相关产品推荐

