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

Python中如何在for循环中使用fillna?解决DataFrame副本赋值报错

解决DataFrame填充NaN时的SettingWithCopy警告问题

问题根源

你遇到的警告是因为dataset.loc[:,title]返回的可能是原DataFrame的切片副本,而非直接指向原数据的视图。用inplace=True修改副本时,pandas无法确认你是否想修改原数据,所以抛出警告,甚至可能导致填充操作根本没作用到原dataset上,这也是后续seaborn箱线图出问题的原因。

解决方案

方案1:直接赋值给原DataFrame列(最稳妥)

放弃inplace=True,将填充后的结果直接赋值回原列,确保修改的是原DataFrame:

for title in object_null_columns:
    # mode()返回Series,取第一个众数(避免多众数情况)
    mode_val = dataset[title].mode()[0]
    # 直接赋值,确保修改原数据
    dataset[title] = dataset[title].fillna(mode_val)

方案2:先将dataset转为独立副本

如果dataset是从另一个大DataFrame切片得到的(比如dataset = big_df[big_df['col'] > 10]),先把它转成独立副本,之后的操作就不会触发警告:

# 先创建独立副本
dataset = dataset.copy()
# 再执行填充循环
for title in object_null_columns:
    mode_val = dataset[title].mode()[0]
    dataset.loc[:, title].fillna(mode_val, inplace=True)

关键注意点

  • mode()返回的是Series对象,如果某列存在多个众数,会返回多个值,因此必须用[0]取第一个众数作为填充值,否则fillna会因传入Series出现异常。
  • 尽量避免在切片上使用inplace=True,直接赋值的方式更清晰,也能规避pandas的视图/副本歧义问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:32:36