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

如何用对应列表值填充DataFrame各列的NaN值?

解决DataFrame按列位置用指定值填充NaN及消除SettingWithCopyWarning问题

问题分析

你当前的代码存在两个核心问题:

  1. 第一个循环逻辑错误:嵌套列循环会让每一列被所有填充值重复覆盖,无法实现「对应列用对应位置值填充」的需求;
  2. SettingWithCopyWarning警告:说明ts_wet是从其他DataFrame切片得到的副本,而非原数据的引用,pandas无法确定你是否要修改原数据,因此抛出警告。

解决方案

步骤1:消除SettingWithCopyWarning

先将ts_wet转换为独立的DataFrame副本,避免修改切片时的警告:

ts_wet = ts_wet.copy()

步骤2:按列位置对应填充NaN

提供两种可靠实现方式:

方式一:按列索引循环填充

直接遍历列的索引位置,将列表中对应位置的值填充到对应列的NaN:

# 遍历每个列的索引
for col_idx in range(len(ts_wet.columns)):
    # 获取当前列名和对应的填充值
    current_col = ts_wet.columns[col_idx]
    fill_val = averages_wet[col_idx]
    # 填充NaN(不用inplace,直接赋值更安全)
    ts_wet[current_col] = ts_wet[current_col].fillna(fill_val)

方式二:用字典映射批量填充(更简洁)

通过zip将列名和填充值配对成字典,传给fillna的value参数实现批量填充:

# 创建列名与填充值的映射字典
fill_mapping = dict(zip(ts_wet.columns, averages_wet))
# 批量填充NaN
ts_wet = ts_wet.fillna(value=fill_mapping)

为什么你的原代码失败

  • 第一个循环中,你错误地使用了未定义的cols变量(应为col),且嵌套的列循环会导致每一列被所有填充值重复处理,完全偏离了「对应列对应值」的逻辑;
  • 直接调用ts_wet.CalamarQ.fillna(..., inplace=True)时,因为ts_wet是切片副本,pandas无法确认修改操作的对象,因此抛出警告,用copy()创建独立副本即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:02:32