问题:让我们从Kaggle提取Titanic数据集。
我有带有“Pclass”,“Sex”和“Age”列的数据框。
我需要使用某些组的中位数来填充“年龄”列中的NaN。
如果是一等类的女性,我想用一等类女性的中位数而不是整个“年龄”列的中位数来填写她的年龄。

问题是如何在一定范围内进行此更改?

我试过了:

data['Age'][(data['Sex'] == 'female')&(data['Pclass'] == 1)&(data['Age'].isnull())].fillna(median)

其中“中位数”是我的值(value),但“inplace = True”的任何更改都无济于事。

非常感谢!

最佳答案

我相信您需要按掩码过滤并分配回去:

data = pd.DataFrame({'a':list('aaaddd'),
                     'Sex':['female','female','male','female','female','male'],
                     'Pclass':[1,2,1,2,1,1],
                     'Age':[40,20,30,20,np.nan,np.nan]})

print (data)
    Age  Pclass     Sex  a
0  40.0       1  female  a
1  20.0       2  female  a
2  30.0       1    male  a
3  20.0       2  female  d
4   NaN       1  female  d
5   NaN       1    male  d

#boolean mask
mask1 = (data['Sex'] == 'female')&(data['Pclass'] == 1)

#get median by mask without NaNs
med = data.loc[mask1, 'Age'].median()
print (med)
40.0

#repalce NaNs
data.loc[mask1, 'Age'] = data.loc[mask1, 'Age'].fillna(med)
print (data)
    Age  Pclass     Sex  a
0  40.0       1  female  a
1  20.0       2  female  a
2  30.0       1    male  a
3  20.0       2  female  d
4  40.0       1  female  d
5   NaN       1    male  d

等同于:
mask2 = mask1 &(data['Age'].isnull())

data.loc[mask2, 'Age'] = med
print (data)
    Age  Pclass     Sex  a
0  40.0       1  female  a
1  20.0       2  female  a
2  30.0       1    male  a
3  20.0       2  female  d
4  40.0       1  female  d
5   NaN       1    male  d

编辑:

如果需要,用中位数替换所有组NaN:
data['Age'] = data.groupby(["Sex","Pclass"])["Age"].apply(lambda x: x.fillna(x.median()))
print (data)

    Age  Pclass     Sex  a
0  40.0       1  female  a
1  20.0       2  female  a
2  30.0       1    male  a
3  20.0       2  female  d
4  40.0       1  female  d
5  30.0       1    male  d

关于python - 如何使用Python Pandas在特定的切片中制作DataFrame和 "fillna"的切片?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47457886/

10-12 23:07