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

