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

遍历Pandas DataFrame修改值无效,使用df.at仍无法解决求助

问题:无法修改Pandas DataFrame中的值?

尝试修改DataFrame数据时,即便用了df.at方法,目标值还是没变化,代码如下:

HOUSING_PATH = "datasets/housing"
csv_path = os.path.join(HOUSING_PATH, "property6.csv")
housing = pd.read_csv(csv_path)

headers = ['Sold Price', 'Longitude', 'Latitude', 'Land Size', 'Total Bedrooms', 'Total Bathrooms', 'Parking Spaces']
# 希望将114行的停车位值(405)改为空值、0或None,因为405不符合逻辑

for index in housing.index:
    # 获取单元格的总停车位数量
    row = housing.at[index, headers[6]]
    # 如果总停车位大于20
    if row > 20:
        # 改为空值
        row = ''

print(housing.at[114, headers[6]])
# 输出仍然是405

已确认该列数据类型为<class 'numpy.float64'>,判断语句能正常执行,但就是无法修改值。


原因分析

你犯了典型的赋值逻辑错误:
row = housing.at[index, headers[6]]只是把DataFrame单元格的数值复制到了局部变量row中,后续row = ''仅仅修改了这个变量的内容,完全没有对DataFrame本身的数据做任何改动。


解决方案

方案1:循环中直接用.at修改DataFrame

不要把值复制到变量,直接通过.at定位单元格并赋值:

for index in housing.index:
    parking_val = housing.at[index, headers[6]]
    if parking_val > 20:
        # 推荐用pd.NA适配float类型的缺失值,避免列类型变为object
        housing.at[index, headers[6]] = pd.NA
        # 如果要设为0,直接写:
        # housing.at[index, headers[6]] = 0

方案2:用矢量化操作(更高效,推荐)

Pandas不推荐用循环处理数据,用loc做矢量化筛选赋值,速度更快,代码更简洁:

# 筛选出停车位>20的行,直接赋值为pd.NA
housing.loc[housing[headers[6]] > 20, headers[6]] = pd.NA

# 若要设为0,替换为:
# housing.loc[housing[headers[6]] > 20, headers[6]] = 0

注意:因为你的列是float64类型,不要用空字符串''赋值,否则会导致列类型变为object,后续数值计算会出问题。pd.NA是Pandas专为数值类型设计的缺失值标记,能保持列的数值类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:24:13