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

使用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

相关产品推荐
方舟 Agent Plan

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

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