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
相关产品推荐
相关产品推荐

