如何基于分组统计均值填充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
相关产品推荐
相关产品推荐

