0

0

如何根据分组列的众数填充 Pandas DataFrame 中的缺失值

心靈之曲

心靈之曲

发布时间:2026-01-10 14:05:30

|

996人浏览过

|

来源于php中文网

原创

如何根据分组列的众数填充 Pandas DataFrame 中的缺失值

本文介绍使用 pandas 的 `groupby().transform()` 结合 `mode()` 高效填充缺失值的方法,无需手动构建映射表,代码简洁、可读性强且性能优异。

在数据预处理中,按某一列(如 col_B)分组后,用该组内另一列(如 col_A)的众数(most frequent value) 填充其缺失值,是一种常见且语义合理的插补策略。相比全局均值或中位数填充,它能更好保留局部分布特征。

Pandas 提供了优雅的一行式解决方案:利用 groupby().transform() 将聚合结果广播回原始索引长度,并配合自定义函数处理每组内的缺失值。核心思路是:对每组 col_A 数据调用 .mode() 获取众数(注意处理空组),再用 .fillna() 完成替换。

以下是完整实现示例:

Whimsical
Whimsical

Whimsical推出的AI思维导图工具

下载
import pandas as pd
import numpy as np

# 构造示例数据
df = pd.DataFrame({
    'col_A': [8, 7, 20, np.nan, 8, 9, 37, np.nan, np.nan],
    'col_B': [31, 30, 83, 5, 31, 34, 158, 5, 30]
})

# 定义安全的众数填充函数(兼容空组与多众数情况)
def impute_mode(series):
    modes = series.mode()
    if len(modes) > 0:
        return series.fillna(modes.iloc[0])  # 取第一个众数(.mode() 返回 Series)
    else:
        return series.fillna(series.dropna().iloc[0] if len(series.dropna()) > 0 else np.nan)

# 应用分组填充:按 col_B 分组,对 col_A 执行众数填充
df['col_A_filled'] = df.groupby('col_B')['col_A'].transform(impute_mode)

print(df)
✅ 输出说明:当 col_B == 5 时,若该组 col_A 中 1 出现最频繁,则所有 col_B == 5 且 col_A 为 NaN 的行将被填为 1;同理适用于其他 col_B 组别。

注意事项:

  • .mode() 返回 Series,即使只有一个众数也需用 .iloc[0] 提取标量值;
  • 若某组内 col_A 全为 NaN,.mode() 返回空 Series,此时函数回退至 np.nan,避免报错;
  • transform 保证输出长度与原 DataFrame 一致,天然支持赋值到新列;
  • 不推荐使用 apply(lambda x: x.fillna(x.mode().iloc[0])) —— apply 在 transform 上下文中行为不一致,易出错。

该方法完全避免了手动构建索引列表、双重循环和中间 DataFrame,既符合 Pandas 的向量化哲学,又具备良好的可维护性与扩展性(如后续改为中位数或条件众数也只需修改函数内部逻辑)。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

51

2025.12.04

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

47

2026.01.05

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

34

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

33

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 45.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号