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

