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

如何将DataFrame最后一行指定列的NaN值替换为前一行值

问题描述

我有一个DataFrame,最后一行的C列值为NaN,数据示例如下:

A,B,C
94,35.8621497534,139.8811398413,23.075931722607212
95,35.8621915301,139.8811617064,23.013675634522304
96,35.8622333249,139.8811835151,22.93392191824463
97,35.8622751476,139.881205254,22.98818503390619
98,35.8623169559,139.8812270428,23.12554949571689
99,35.8623587254,139.8812489567,23.269025725355807
100,35.8624004417,139.8812709946,23.080210277956407
101,35.8624422121,139.881292861,Nan

尝试将该NaN替换为前一行数值时,出现以下警告且修改未生效:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

我使用的代码:

rowi=df.shape[0]
df.iloc[row-1]['C']=df.tail(2)['C'].iloc[0]
解决方案

方法1:使用.loc直接定位修改(推荐)

Pandas官方推荐用.loc进行行和列的精准定位赋值,能彻底避免切片拷贝的问题:

# 获取最后一行的索引
last_row_idx = df.index[-1]
# 用前一行的C列值填充最后一行的C列
df.loc[last_row_idx, 'C'] = df.loc[df.index[-2], 'C']

方法2:修复.iloc的链式索引问题

你原代码的问题在于链式索引(df.iloc[row-1]['C']):第一次iloc返回的是原DataFrame的拷贝,后续赋值只修改了这个临时拷贝,不会影响原数据。改成单步索引即可:

# 直接用iloc定位行和列的位置
c_col_pos = df.columns.get_loc('C')
df.iloc[-1, c_col_pos] = df.iloc[-2, c_col_pos]

方法3:通用向前填充(适合批量处理NaN)

如果需要处理多个NaN值,用ffill()(向前填充)会更高效,它自动用前一行的非NaN值填充当前NaN:

# 仅对C列执行向前填充,直接修改原DataFrame
df['C'].ffill(inplace=True)
# 或者不修改原数据,返回新的Series:
# df['C'] = df['C'].ffill()

原代码无效的原因

df.iloc[row-1]['C']是两次独立的索引操作:第一次iloc[row-1]返回一行数据的拷贝,第二次['C']访问该拷贝的列,赋值操作仅作用于这个临时拷贝,不会同步到原DataFrame中。而.loc或单步.iloc操作直接作用于原DataFrame的视图,修改会直接生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:02:07