问题:让我们从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/