Pandas - fillna 与特定类别的平均值

Posted

技术标签:

【中文标题】Pandas - fillna 与特定类别的平均值【英文标题】:Pandas - fillna with mean for specific categories 【发布时间】:2021-01-10 23:16:46 【问题描述】:

我想用列的平均数填写,但仅适用于与缺失值相同类别的代表

data = 'Class': ['Superlight', 'Aero', 'Aero', 'Superlight', 'Superlight', 'Superlight', 'Aero', 'Aero'],
        'Weight': [5.6, 8.6, np.nan, 5.9, 5.65, np.nan, 8.1, 8.4]


    Class   Weight
0   Superlight     5.60
1   Aero           8.60
2   Aero           NaN
3   Superlight     5.90
4   Superlight     5.65
5   Superlight     NaN
6   Aero           8.10
7   Aero           8.40

我知道我能做到:

df.Weight.fillna(df.Weight.mean())

但这会用整列的平均值填充缺失值。

以下内容将用 AERO 类别的平均值替换空值(这更好,但仍然不好,因为我必须分别为每个类别/类做)

df.Weight.fillna(df[df.Class == 'Aero'].Weight.mean())

是否可以将其抽象化,以便自动获取当前行的 Class 并找到属于该类别的值的平均值并替换它而不对 Class 值进行硬编码?希望这是有道理的。

【问题讨论】:

【参考方案1】:

groupby + transform 然后填写:

df['Weight'].fillna(df.groupby("Class")['Weight'].transform("mean"))

0    5.600000
1    8.600000
2    8.366667
3    5.900000
4    5.650000
5    5.716667
6    8.100000
7    8.400000
Name: Weight, dtype: float64

【讨论】:

【参考方案2】:

也许您可以尝试使用groupbyapply 到每个组:

df.groupby('Class')['Weight'].apply(lambda g: g.fillna(g.mean()))

【讨论】:

以上是关于Pandas - fillna 与特定类别的平均值的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用fillna函数将dataframe中的缺失值按照列均值进行填充(fill missing values with the mean of the column)

pandas中如何对指定列做fillna

Pandas Groupby:计数和平均值相结合

Pandas fillna('Missing')

pandas.DataFrame.fillna - TypeError:只有整数标量数组可以转换为标量索引

Fillna 一次使用多种方法 - pandas