有条件地替换 NaN Python Pandas

Conditionally replacing NaNs Python Pandas

抱歉 n00b 问题。

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

例如,passengerID 6 是 3rd class 的男性,他的年龄为 NaN。我想要的是用第 3 class 名男性的平均年龄替换 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)

令人惊讶的是它不起作用。我不确定为什么?首先,如果有人可以建议为什么它不起作用,那就太好了。其次,我觉得应该有更多 'Pythonistic' 的方式来做到这一点,但我不确定具体怎么做。我知道 Stack 上还有另一个可能重复的主题,但它并不能完全解释为什么我的代码无法正常工作,如果这 post 打扰了人们,我们深表歉意。干杯

您可以通过 groupby().transform()

一次性完成此操作
s = train.groupby(['male', 'Pclass'])['Age'].transform('mean')

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