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

Python:使用loc[]+iloc[]+loc[]更新Pandas DataFrame单个值失败问题求助

解决DataFrame修改特定行值的问题

我来帮你搞定这个问题!你遇到的核心问题是链式索引返回的是数据副本而非原DataFrame的视图,所以你修改的只是临时副本,原数据根本没变化。咱们一步步来解决:

问题原因

当你用df.loc['ABBOTSFORD'].iloc[-1].loc[2006] = 3000这种链式调用时,Pandas无法保证返回的是原数据的视图——大多数情况下,这种操作会生成一个独立的临时副本,你的修改只作用在这个副本上,原DataFrame自然不会更新。

解决方案

这里提供两种可靠的方法,都能直接修改原DataFrame:

方法1:通过位置索引精准定位

先找到目标行的位置,再直接修改对应列的值:

import pandas as pd

df = pd.DataFrame([['ABBOTSFORD', 427000, 448000],['ABBOTSFORD', 427000, 448000], ['ABERFELDIE', 534000, 600000],['ABBOTSFORD', 427000, 66666]], columns=['Locality', 2005, 2006])
df.set_index('Locality', inplace=True)

# 获取所有"ABBOTSFORD"行的位置索引
abbotsford_positions = df.index.get_loc('ABBOTSFORD')
# 取最后一行的位置
last_row_pos = abbotsford_positions[-1]

# 定位到该行的2006列并修改
df.iloc[last_row_pos, df.columns.get_loc(2006)] = 3000

print(df)

方法2:布尔索引结合tail()

筛选出目标索引的所有行,取最后一行直接修改:

import pandas as pd

df = pd.DataFrame([['ABBOTSFORD', 427000, 448000],['ABBOTSFORD', 427000, 448000], ['ABERFELDIE', 534000, 600000],['ABBOTSFORD', 427000, 66666]], columns=['Locality', 2005, 2006])
df.set_index('Locality', inplace=True)

# 筛选出ABBOTSFORD的行,取最后一行的2006列修改
df.loc[df.index == 'ABBOTSFORD', 2006].iloc[-1] = 3000

# 或者更稳妥的写法(避免潜在的副本问题):
# df.loc[df.index == 'ABBOTSFORD', 2006] = df.loc[df.index == 'ABBOTSFORD', 2006].iloc[:-1].tolist() + [3000]

print(df)

运行结果

两种方法都会输出更新后的DataFrame,最后一行的2006列会变成3000:

2005   2006
Locality                
ABBOTSFORD  427000  448000
ABBOTSFORD  427000  448000
ABERFELDIE  534000  600000
ABBOTSFORD  427000   3000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:07:41