You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于分组统计均值填充DataFrame中的缺失值?

用分组均值填充缺失值的实现方法

不用写繁琐的if-else语句,直接利用pandas的内置方法就能高效完成填充,以下是两种实用方案:

方法一:通过merge关联分组均值后填充

先将均值数据集与原数据集按PClass和Sex两个分组字段关联,再把匹配到的均值填充到缺失的Age列:

import pandas as pd
import numpy as np

# 你的均值数据集
impute_data = pd.DataFrame({'PClass': [1, 1, 2, 2, 3, 3], 'Sex': ['male', 'female', 'male', 'female', 'male', 'female',], 'Mean': [34, 29, 24, 40, 18, 25]})

# 你的含缺失值的数据集
d = {'PClass': [1, 3, 2, 3, 2, 1, 2, 1, 3, 2, 3, 1], 
     'Sex': ['male', 'male', 'female', 'male', 'female', 'female', 'male', 'male', 'female', 'male', 'female', 'female'], 
     'Age': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]}
df = pd.DataFrame(data=d)

# 按分组字段合并数据集
df_merged = df.merge(impute_data, on=['PClass', 'Sex'], how='left')
# 填充缺失的Age值(如果原数据集有非缺失Age,改用fillna)
df['Age'] = df_merged['Mean']

# 查看结果
print(df)

如果原数据集中存在部分非缺失的Age值,把最后一步改成:

df['Age'] = df['Age'].fillna(df_merged['Mean'])

方法二:构建映射字典后逐行匹配填充

先把分组均值转换成以(PClass, Sex)为键的字典,再通过apply匹配填充:

# 构建分组-均值的映射字典
age_map = impute_data.set_index(['PClass', 'Sex'])['Mean'].to_dict()

# 填充缺失的Age值
df['Age'] = df.apply(lambda row: age_map[(row['PClass'], row['Sex'])], axis=1)

# 查看结果
print(df)

同样,如果有非缺失Age,改用fillna:

df['Age'] = df['Age'].fillna(df.apply(lambda row: age_map[(row['PClass'], row['Sex'])], axis=1))

为什么不用if-else?

逐行写if-else会让代码冗余、可读性差,且处理大数据集时效率极低。pandas的上述方法是向量化/批量处理,代码简洁且运行效率更高。

内容的提问来源于stack exchange,提问作者Armando Bridena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:25:20