【问题标题】:Conditionally replacing NaNs Python Pandas有条件地替换 NaNs Python Pandas
【发布时间】:2019-11-20 01:15:46
【问题描述】:

很抱歉提出 n00b 问题。

我是 Kaggle 的新手,已经开始查看他们的一些比赛,其中一个初学者是关于著名的泰坦尼克号数据的。我的问题是关于在 Age 列中填写 NaN。我想做的是对于 Age 列中的每个 NaN,我想将其替换为该 Class 和 Sex 的平均年龄。

例如,passengerID 6 是 3rd class 的 Man,他的年龄为 NaN。我想要的是用三等男性的平均年龄替换那个 NaN。这是 26.5。

到目前为止我尝试过的如下:

man_1 = train[(train['male'] == 1) & (train['Pclass'] == 1)]['Age'].mean()
train[(train['male'] == 1) & (train['Pclass'] == 1)]['Age'].fillna(man_1, inplace=True)

man_2 = train[(train['male'] == 1) & (train['Pclass'] == 2)]['Age'].mean()
train[(train['male'] == 1) & (train['Pclass'] == 2)]['Age'].fillna(man_2, inplace=True)

man_3 = train[(train['male'] == 1) & (train['Pclass'] == 3)]['Age'].mean()
train[(train['male'] == 1) & (train['Pclass'] == 3)]['Age'].fillna(man_3, inplace=True)

wom_1 = train[(train['male'] == 0) & (train['Pclass'] == 1)]['Age'].mean()
train[(train['male'] == 0) & (train['Pclass'] == 1)]['Age'].fillna(wom_1, inplace=True)

wom_2 = train[(train['male'] == 0) & (train['Pclass'] == 2)]['Age'].mean()
train[(train['male'] == 0) & (train['Pclass'] == 2)]['Age'].fillna(wom_2, inplace=True)

wom_3 = train[(train['male'] == 0) & (train['Pclass'] == 3)]['Age'].mean()
train[(train['male'] == 0) & (train['Pclass'] == 3)]['Age'].fillna(wom_3, inplace=True)

而且 quelle 惊喜它不起作用。我不确定为什么?首先,如果有人能提出为什么它不起作用,那就太好了。其次,我觉得应该有一种更“Pythonistic”的方式来做到这一点,但我不确定具体如何。我知道 Stack 上还有另一个可能重复的主题,但它并不能完全解释为什么我的代码不起作用,如果这篇文章惹恼了人们,很抱歉。干杯

【问题讨论】:

  • 'Pythonistic' >> pythonic ;)
  • 如果你使用 '.loc' 会怎样? train.loc[(train['male'] == 1) & (train['Pclass'] == 1),'Age'].fillna(man_1, inplace=True)
  • NaN 仍然存在 :(

标签: python pandas nan


【解决方案1】:

您可以通过groupby().transform() 一次性完成此操作

s = train.groupby(['male', 'Pclass'])['Age'].transform('mean')

df['Age'] = df['Age'].fillna(s)

【讨论】:

  • 为了可读性和调试,我通常更喜欢显式赋值而不是 inplace
猜你喜欢
  • 2019-04-08
  • 2014-03-03
  • 2019-04-08
相关资源
最近更新 更多