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

如何在Pandas中按条件替换NaN值?泰坦尼克数据集遇警告

解决Pandas SettingWithCopyWarning问题:按性别填充Age缺失值

嘿,我来帮你搞定这个烦人的警告!首先得说,你的思路完全没问题——按性别分组用均值填充缺失值是处理泰坦尼克号Age列的经典操作,但代码里的链式索引写法踩了Pandas的坑。

为什么会出现警告?

你用了df[(df['Sex']=='male') & (df['Age'].apply(np.isnan))]['Age']这种链式索引(先筛选行再选列),Pandas没法确定你操作的是原DataFrame的「视图」还是「副本」。当你用inplace=True修改时,你可能只是在修改一个临时副本,原DataFrame根本没被更新,所以Pandas抛出警告提醒你这个风险。

两种正确的写法

方法1:用.loc精准定位(直观易懂)

先计算男女的平均年龄,再用.loc直接定位到原DataFrame的对应位置赋值,彻底避免链式索引:

import pandas as pd
import numpy as np

df = pd.read_csv('train.csv')

# 计算男女各自的平均年龄
male_avg = df[df['Sex'] == 'male']['Age'].mean()
female_avg = df[df['Sex'] == 'female']['Age'].mean()

# 用.loc定位并填充男性缺失的Age
df.loc[(df['Sex'] == 'male') & (df['Age'].isna()), 'Age'] = male_avg
# 填充女性缺失的Age
df.loc[(df['Sex'] == 'female') & (df['Age'].isna()), 'Age'] = female_avg

这里用df['Age'].isna()代替np.isnan更贴合Pandas的用法,效果完全一致。

方法2:用groupby+transform(简洁优雅)

这种方法是Pandas处理分组填充的标准写法,一行代码搞定,还能避免手动计算均值:

import pandas as pd

df = pd.read_csv('train.csv')

# 按Sex分组,用每组的均值填充Age的缺失值
df['Age'] = df.groupby('Sex')['Age'].transform(lambda x: x.fillna(x.mean()))

transform会把每组的均值广播到该组的缺失位置,直接返回和原Series长度一致的结果,赋值回原列就完成了更新。

验证一下

你可以运行df['Age'].isna().sum()看看缺失值数量,应该变成0了,而且不会再出现那个警告~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:31:46