如何基于字符串分组列,使用Pandas Transform实现分组均值插补?
解决方案:按字符串列分组,用组内均值填充数值列缺失值
没问题,针对你这种以字符串类型列(比如车型)分组填充数值列缺失值的场景,用Pandas的groupby + transform组合就能完美解决,我给你一步步拆解实现方法,附样本数据和代码:
1. 先构造符合你场景的样本数据
假设你的数据长这样(你可以直接替换成自己的真实数据集):
import pandas as pd import numpy as np # 构造样本数据:车型是字符串列,里程、发动机功率存在缺失值 data = { 'Car Model': ['Toyota Camry', 'Toyota Camry', 'Honda Accord', 'Honda Accord', 'Toyota Camry', 'Honda Accord', 'Ford F-150', 'Ford F-150'], 'Mileage': [50000, np.nan, 60000, np.nan, 55000, 62000, np.nan, 70000], 'Engine Power': [178, np.nan, 192, 190, np.nan, np.nan, 375, np.nan] } df = pd.DataFrame(data)
2. 核心实现代码
关键是先指定需要填充的数值列,然后按字符串分组后用transform计算组内均值并填充缺失值:
# 定义需要填充的数值列(根据你的实际列名调整) num_cols = ['Mileage', 'Engine Power'] # 按车型分组,对每组的数值列用组内均值填充缺失值 df[num_cols] = df.groupby('Car Model')[num_cols].transform( lambda x: x.fillna(x.mean()) )
3. 代码解释
groupby('Car Model'):以字符串类型的车型列为分组依据,把相同车型的行归为一组transform(lambda x: x.fillna(x.mean())):对每个组的每个数值列,计算该组的均值,然后用这个均值替换组内该列的所有缺失值。transform的作用是让结果保持和原DataFrame相同的索引,不会打乱原有数据结构- 只对
num_cols指定的数值列操作,避免误修改字符串列
4. 特殊情况处理(可选)
如果某个车型组内的某列全部是缺失值,那x.mean()会得到NaN,这时候可以用全局均值兜底:
df[num_cols] = df.groupby('Car Model')[num_cols].transform( lambda x: x.fillna(x.mean() if not pd.isna(x.mean()) else df[x.name].mean()) )
验证结果
执行完代码后,你可以用df.isnull().sum()检查缺失值是否已经被填充,或者直接打印df查看具体填充后的数值。
内容的提问来源于stack exchange,提问作者user16755
相关产品推荐
相关产品推荐

