如何为fillna()传入函数,按OSEBuildingID分组填充缺失值
代码失效原因与修复方案
原有代码无效的两个核心问题
- 未将
transform的计算结果赋值回原数据列。pandas的分组类操作默认返回处理后的副本,不会直接修改原DataFrame的列值,即便分组逻辑正确,没有把返回值覆盖到目标列,原数据集的缺失值不会产生任何变化。 - 众数计算的返回值类型不匹配。
Series.mode()的返回值是包含所有出现频次最高值的Series对象,而非单个可用于填充的标量值,直接传入fillna()会因索引无法对齐,导致填充逻辑完全失效。
适配业务场景的正确实现
结合你提到的“同一OSEBuildingID对应的该列取值基本一致”的特征,不需要额外计算组内众数,直接提取同组内的有效非空值填补缺失即可,兼顾执行效率与准确性:
df['LargestPropertyUseTypeGFA'] = df.groupby('OSEBuildingID')['LargestPropertyUseTypeGFA'].transform( lambda group: group.fillna(group.dropna().iloc[0]) if len(group.dropna()) > 0 else group )
如果确实需要按组内众数逻辑填充,需要对mode的返回值做标量提取,避免类型不匹配的问题:
df['LargestPropertyUseTypeGFA'] = df.groupby('OSEBuildingID')['LargestPropertyUseTypeGFA'].transform( lambda group: group.fillna(group.mode().iloc[0]) if not group.mode().empty else group )
补充说明
- 上述逻辑会自动跳过全组为空值的分组,不会因找不到有效填充值抛出索引越界错误
- 填充完成后,可以用
df['LargestPropertyUseTypeGFA'].isna().sum()校验剩余缺失值规模,确认同建筑ID的可填充缺失已被覆盖
内容的提问来源于stack exchange,提问作者Shyan
相关产品推荐
相关产品推荐

