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

如何按分组均值填充DataFrame各列缺失值并保留字符串列?

按分组均值填充DataFrame缺失值并保留非数值列的解决方案

问题背景

现有包含group_label列(分组为0和1)的DataFrame,需基于分组均值而非整列均值填充其他列的缺失值。使用代码df1 = df.groupby("group_label").transform(lambda x: x.fillna(x.mean()))时遇到两个问题:

  • 均值计算错误(非数值列参与均值计算导致异常)
  • 丢失ID等字符串列

解决方案

1. 拆分数值与非数值列

先将DataFrame拆分为需要填充的数值列,以及不需要处理的非数值列(如ID、字符串类型列),避免非数值列干扰均值计算,同时保留这些列。

import pandas as pd

# 筛选数值列(排除group_label,因为它是分组依据)
numeric_cols = df.select_dtypes(include=['number']).drop('group_label', errors='ignore')
# 筛选非数值列
non_numeric_cols = df.select_dtypes(exclude=['number'])

2. 分组填充数值列缺失值

仅对数值列执行分组填充操作,确保均值计算只针对有效数值:

# 按group_label分组,用分组均值填充数值列的缺失值
filled_numeric = df.groupby('group_label')[numeric_cols.columns].transform(
    lambda x: x.fillna(x.mean())
)

3. 合并所有列

将填充后的数值列与原非数值列、group_label列合并,恢复完整的DataFrame:

# 合并列并保持原DataFrame的列顺序
df_filled = pd.concat([non_numeric_cols, filled_numeric, df['group_label']], axis=1)[df.columns]

简化写法

如果想更简洁,直接在原DataFrame上更新数值列即可,无需拆分合并:

df_filled = df.copy()
df_filled[numeric_cols.columns] = df_filled.groupby('group_label')[numeric_cols.columns].transform(
    lambda x: x.fillna(x.mean())
)

错误原因说明

  • 均值计算错误:原代码对所有列执行transform,包括非数值列,字符串类型无法计算均值,导致结果异常。
  • 丢失列:groupby.transform仅返回参与计算的列,非数值列未被包含,因此直接赋值会丢失这些列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:05:32