如何根据分组平均值填充缺失值?

时间:2020-06-02 21:01:09

标签: python group-by missing-data

我的数据缺少“年龄”的值,我希望根据“分组”列的“平均值”将其平均替换。在命令之后:

df.groupby('Title').mean()['Age']

例如,我有一个列表

32先生

小姐21.7

28女士

我尝试过:

df['Age'].replace(np.nan, 0, inplace=True)
df[(df.Age==0.0)&(df.Title=='Mr')]

仅查看缺少年龄且标题是一种类型但不起作用的单元格。

问题1.尽管多个单元格同时满足两个条件(年龄= 0.0,标题为mr),为什么上面的代码没有显示任何单元格

问题2。如上所述,如何根据组平均值替换所有缺失值?

2 个答案:

答案 0 :(得分:1)

我无法重现第一个错误,因此,如果我使用如下示例:

import pandas as pd
import numpy as np
np.random.seed(111)
df = pd.DataFrame({'Title':np.random.choice(['Mr','Miss','Mrs'],20),'Age':np.random.randint(20,50,20)})
df.loc[[5,9,10,11,12],['Age']]=np.nan

数据框如下:

Title   Age
0   Mr  42.0
1   Mr  28.0
2   Mr  25.0
3   Mr  32.0
4   Mrs 26.0
5   Miss    NaN
6   Mrs 32.0
7   Mrs 33.0
8   Mrs 25.0
9   Mr  NaN
10  Miss    NaN
11  Mr  NaN
12  Mrs NaN
13  Miss    38.0
14  Mr  31.0
15  Mr  42.0
16  Mr  24.0
17  Mrs 23.0
18  Mrs 49.0
19  Miss    27.0

我们可以仅需再执行一步就可以替换它:

ave_age = df.groupby('Title').mean()['Age']
df.loc[pd.isna(df['Age']),'Age'] = ave_age[df.loc[pd.isna(df['Age']),'Title']].values

答案 1 :(得分:0)

问题1: 请提供摘录,以便能够重现错误

问题2:

尝试df['Age'].fillna(f.groupby('Title')['Age'].transform('mean'))。这类似于Pandas: filling missing values by mean in each group