我在玩Titanic数据集,我想做的是用基于Pclass
的中值填充Age
列的所有NaN/Null值。在
以下是一些数据:
train
PassengerId Pclass Age
0 1 3 22
1 2 1 35
2 3 3 26
3 4 1 35
4 5 3 35
5 6 1 NaN
6 7 1 54
7 8 3 2
8 9 3 27
9 10 2 14
10 11 1 Nan
最后我想说的是:
^{pr2}$我想到的第一件事是——为了简洁起见,我只包含了Pclass
等于1的一个切片,而不是包括2和3:
Pclass_1 = train['Pclass']==1
train[Pclass_1]['Age'].fillna(train[train['Pclass']==1]['Age'].median(), inplace=True)
据我所知,这种方法创建一个视图,而不是编辑train
本身(我不太明白这与副本有什么不同,或者它们在内存方面是否相似——如果可能的话,这是我很乐意听到的旁白)。我特别喜欢这个关于View vs Copy, How Do I Tell?主题的问答,但它不包括我想要的洞察力。在
通过查看Pandas文档,我了解了为什么要使用.loc
来避免这个陷阱。不过,我似乎无法正确理解语法。在
Pclass_1 = train.loc[:,['Pclass']==1]
Pclass_1.Age.fillna(train[train['Pclass']==1]['Age'].median(),inplace=True)
我在指数上迷路了。这篇文章最后要查找一个名为False
的列,这个列显然不存在。我不知道如果没有链式索引怎么做。train.loc[:,train['Pclass']==1]
返回异常IndexingError: Unalignable boolean Series key provided
。在
在这段线路上
部件
['Pclass'] == 1
将列表['Pclass']
与返回False
的值1
进行比较。然后,.loc[]
被计算为导致错误的.loc[:,False]
。在我想你的意思是:
^{pr2}$它选择Pclass为1的所有行。这修复了错误,但仍将提供“SettingWithCopyWarning”。在
编辑1
(删除旧代码)
这里有一个方法,它使用
groupby
和transform
来创建Series
包含每个Pclass
的中值Age
。然后使用Series
作为fillna()
的参数,用中值替换丢失的值。使用这种方法将同时纠正所有乘客等级,这正是OP最初要求的。答案来自于Python-pandas Replace NA with the median or mean of a group in dataframe代码产生:
需要注意的是,这行代码使用
inplace=True
:可以使用
.loc
替换为赋值:相关问题 更多 >
编程相关推荐