0

0

Pandas中基于分组均值填充缺失值的专业指南

霞舞

霞舞

发布时间:2025-11-06 13:47:36

|

655人浏览过

|

来源于php中文网

原创

Pandas中基于分组均值填充缺失值的专业指南

本文详细介绍了在pandas dataframe中,如何高效且准确地根据另一列的分组均值来填充目标列中的缺失值(nan)。通过使用`groupby()`结合`transform('mean')`方法,可以生成与原始dataframe索引对齐的组均值序列,进而利用`fillna()`函数实现批量填充,避免了`inplace`参数误用导致的常见问题

数据清洗和预处理过程中,处理缺失值是一个常见且重要的步骤。当缺失值的填充逻辑依赖于数据中特定分组的统计量时,例如根据某个分类列的均值来填充数值列的缺失值,Pandas提供了强大而灵活的工具来完成这项任务。本教程将深入探讨如何利用groupby()和transform()方法,结合fillna()函数,实现基于分组均值的高效缺失值填充。

理解问题与常见误区

假设我们有一个DataFrame,其中一列包含缺失值,而我们需要根据另一列(如类别列)的不同分组来计算各自的均值,并用这些均值来填充对应分组的缺失值。

例如,原始问题中提及的场景:

import pandas as pd

# 假设df是原始DataFrame,其中'InternetService'是分组列,'Bandwidth_GB_Year'是需要填充的列
# mean_values = df.groupby("InternetService")["Bandwidth_GB_Year"].mean().round(3)
# print(mean_values)

如果直接尝试使用df["Bandwidth_GB_Year"].fillna(mean_values, inplace=True),可能会遇到问题。fillna()函数在接收一个Series作为参数时,会尝试根据索引进行匹配。虽然mean_values包含了分组均值,但它的索引是InternetService的唯一值,而不是原始DataFrame的行索引。因此,直接传入mean_values并期望它能智能地根据InternetService列进行匹配填充,是无法实现的。

更重要的是,当使用df["Bandwidth_GB_Year"] = df["Bandwidth_GB_Year"].fillna(mean_values, inplace = True)这种形式时,inplace=True会使得fillna()函数在原始Series上直接进行修改,并返回None。这意味着赋值操作df["Bandwidth_GB_Year"] = None,从而导致整个列被替换为None。这是使用inplace=True时一个非常常见的误区,尤其是在将其结果赋值给变量时。

使用 groupby().transform('mean') 进行高效填充

解决上述问题的关键在于生成一个与原始DataFrame索引对齐的Series,其中每个元素都是其对应分组的均值。groupby()方法结合transform()函数正是为此而设计。

transform()方法在groupby对象上应用一个函数(如mean),并返回一个与原始DataFrame或Series具有相同索引和长度的Series。对于每个原始行,transform()会根据其所属的分组计算并返回该分组的聚合结果。

示例代码

让我们通过一个简化的例子来演示这个过程:

import pandas as pd
import numpy as np

# 创建一个示例DataFrame
df = pd.DataFrame({
    'col1': [1, 2, 1, 2, 1, 1, 2, 3, 3, 3],
    'col2': [5, 4, np.nan, 3, np.nan, 7, 9, 1, np.nan, 2]
})

print("原始 DataFrame:")
print(df)

# 根据 'col1' 列分组,并用 'col2' 列的均值填充缺失值
# 1. 使用 groupby().transform('mean') 生成一个与df['col2']索引对齐的均值Series
group_means_aligned = df.groupby('col1')['col2'].transform('mean')

print("\n根据 'col1' 分组的 'col2' 均值(已对齐原始索引):")
print(group_means_aligned)

# 2. 使用 fillna() 方法填充缺失值
df['col2'] = df['col2'].fillna(group_means_aligned)

print("\n填充缺失值后的 DataFrame:")
print(df)

代码解析:

VISBOOM
VISBOOM

AI虚拟试衣间,时尚照相馆。

下载
  1. df.groupby('col1')['col2']: 这部分代码将DataFrame按'col1'列进行分组,并选择'col2'列作为我们进行操作的目标。
  2. .transform('mean'): 对每个分组中的'col2'列计算均值。关键在于transform会将这个均值“广播”回原始的行索引。例如,对于col1为1的所有行,transform('mean')会返回col1为1的组的均值;对于col1为2的所有行,则返回col1为2的组的均值,依此类推。
  3. df['col2'].fillna(group_means_aligned): fillna()函数接收group_means_aligned作为参数。由于group_means_aligned的索引与df['col2']的索引完全匹配,fillna()能够准确地找到df['col2']中的NaN值,并用group_means_aligned中对应索引位置的值进行填充。

输出结果:

原始 DataFrame:
   col1  col2
0     1   5.0
1     2   4.0
2     1   NaN
3     2   3.0
4     1   NaN
5     1   7.0
6     2   9.0
7     3   1.0
8     3   NaN
9     3   2.0

根据 'col1' 分组的 'col2' 均值(已对齐原始索引):
0    6.0
1    5.333333
2    6.0
3    5.333333
4    6.0
5    6.0
6    5.333333
7    1.5
8    1.5
9    1.5
Name: col2, dtype: float64

填充缺失值后的 DataFrame:
   col1       col2
0     1   5.000000
1     2   4.000000
2     1   6.000000
3     2   3.000000
4     1   6.000000
5     1   7.000000
6     2   9.000000
7     3   1.000000
8     3   1.500000
9     3   2.000000

从结果可以看出,col1为1的组(原始值5, NaN, NaN, 7)均值为(5+7)/2 = 6.0,缺失值被填充为6.0。col1为2的组(原始值4, 3, 9)均值为(4+3+9)/3 = 5.333,缺失值被填充为5.333。col1为3的组(原始值1, NaN, 2)均值为(1+2)/2 = 1.5,缺失值被填充为1.5。

注意事项

  1. inplace 参数的正确使用:

    • 当使用df[column] = ...进行赋值操作时,切勿在右侧的函数中包含inplace=True。inplace=True会修改原始对象并返回None,导致赋值为None。
    • 如果希望直接修改DataFrame而不进行赋值,可以单独调用df['col2'].fillna(group_means_aligned, inplace=True)。但为了代码的清晰性和避免副作用,通常推荐df['col2'] = df['col2'].fillna(group_means_aligned)这种显式赋值的方式。
  2. 数据类型:

    • 如果原始列是整数类型(如int64),并且包含NaN(在Pandas中,NaN是浮点类型),那么该列的数据类型会自动提升为浮点型(如float64)。填充均值后,列仍将保持浮点型,因为均值通常不是整数。
    • 如果需要将填充后的列转换回整数(在确认没有小数部分或可以接受截断的情况下),可以使用df['col2'] = df['col2'].astype(int),但这会丢失小数信息。如果存在小数,可以使用df['col2'] = df['col2'].round().astype(int)进行四舍五入。
  3. 多列填充:

    • 如果需要根据相同的分组逻辑填充多列,可以对多列应用transform('mean')。
    • 例如:df[['col2', 'col3']] = df.groupby('col1')[['col2', 'col3']].transform('mean')。
  4. 其他聚合函数

    • 除了'mean',transform()还可以与'median'、'sum'、'max'、'min'等其他聚合函数配合使用,以满足不同的填充需求。

总结

通过groupby().transform('mean')结合fillna(),我们能够优雅且高效地解决Pandas DataFrame中基于分组均值填充缺失值的需求。这种方法不仅避免了常见的inplace参数误用,而且生成的代码简洁、易读,是数据预处理中的一项重要技能。理解transform()的工作原理,即它如何将分组聚合结果“广播”回原始DataFrame的索引,是掌握此技巧的关键。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

56

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

309

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

443

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

73

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
AJAX跨域解决方案:JSONP视频教程
AJAX跨域解决方案:JSONP视频教程

共5课时 | 1.4万人学习

React 教程
React 教程

共58课时 | 4.2万人学习

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

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