基于name列分组的大数据miceforest缺失值插补方案咨询
基于name分组的miceforest缺失值填充方案
我们有一个规模庞大的数据库(包含数百万行数据与数百万个姓名),需要基于name列做类似groupby的分组操作后,使用miceforest对每组数据分别进行缺失值插补。以下是示例数据与需求说明:
示例数据代码
data = {'name': ['Alex', 'Ben', 'Marry','Alex', 'Ben', 'Marry'], 'job': ['teacher', 'doctor', 'engineer','teacher', 'doctor', 'engineer'], 'age': [27, 32, 78,27, 32, 78], 'weight': [160, 209, 130,164, 206, 132], 'meal_price': [8, 11, 27, 19, 7, 10], 'date': ['6-12-2022', '6-12-2022', '6-12-2022','6-13-2022', '6-13-2022', '6-13-2022'] }
带缺失值的示例DataFrame
| name | job | age | weight | meal_price | date | |
|---|---|---|---|---|---|---|
| 0 | Alex | teacher | 27 | 160 | 8 | 6-12-2022 |
| 1 | Ben | doctor | 32 | 209 | 11 | 6-12-2022 |
| 2 | Marry | engineer | 78 | 130 | 27 | 6-12-2022 |
| 3 | Alex | teacher | 27 | 164 | 19 | 6-13-2022 |
| 4 | Ben | doctor | 32 | 206 | 7 | 6-13-2022 |
| 5 | Marry | engineer | 78 | 132 | 10 | 6-13-2022 |
| 6 | Alex | teacher | NaN | NaN | NaN | 6-14-2022 |
| 7 | Ben | doctor | NaN | NaN | NaN | 6-14-2022 |
| 8 | Marry | engineer | NaN | NaN | NaN | 6-14-2022 |
解决方案实现
1. 安装必要依赖
确保已安装pandas和miceforest:
pip install pandas miceforest
2. 构造带缺失值的DataFrame
先基于示例数据创建基础数据集,再添加含缺失值的行:
import pandas as pd import miceforest as mf # 构造基础数据 data = {'name': ['Alex', 'Ben', 'Marry','Alex', 'Ben', 'Marry'], 'job': ['teacher', 'doctor', 'engineer','teacher', 'doctor', 'engineer'], 'age': [27, 32, 78,27, 32, 78], 'weight': [160, 209, 130,164, 206, 132], 'meal_price': [8, 11, 27, 19, 7, 10], 'date': ['6-12-2022', '6-12-2022', '6-12-2022','6-13-2022', '6-13-2022', '6-13-2022'] } df = pd.DataFrame(data) # 添加含缺失值的行 missing_rows = pd.DataFrame({ 'name': ['Alex', 'Ben', 'Marry'], 'job': ['teacher', 'doctor', 'engineer'], 'age': [pd.NA, pd.NA, pd.NA], 'weight': [pd.NA, pd.NA, pd.NA], 'meal_price': [pd.NA, pd.NA, pd.NA], 'date': ['6-14-2022', '6-14-2022', '6-14-2022'] }) df = pd.concat([df, missing_rows], ignore_index=True)
3. 按name分组执行插补
遍历每个name分组,对每组数据单独训练miceforest模型并填充缺失值,最后合并所有结果:
# 存储插补后的结果 filled_dfs = [] # 按name分组处理 for name, group in df.groupby('name'): # 初始化miceforest插补器,参数可根据实际场景调整 kernel = mf.ImputationKernel( group, datasets=5, # 生成的插补数据集数量 save_all_iterations=True, random_state=42 ) # 运行插补迭代 kernel.mice(5) # 迭代次数,可根据数据规模调整 # 获取插补后的数据集(这里取第一个插补结果,也可按需合并多个结果) filled_group = kernel.complete_data(0) filled_dfs.append(filled_group) # 合并所有分组的插补结果 final_df = pd.concat(filled_dfs, ignore_index=True)
4. 结果验证
查看最终填充后的数据集:
print(final_df)
大规模数据优化建议
针对数百万行、数百万个姓名的超大规模数据,可通过以下方式提升效率:
- 过滤数据量过少的分组(比如仅1-2条数据的分组,插补参考价值低)
- 采用并行处理(如
multiprocessing库对分组进行并行插补) - 调整miceforest参数:减少
datasets数量、降低迭代次数,平衡插补效果与速度
内容的提问来源于stack exchange,提问作者mnm
相关产品推荐
相关产品推荐

