Pandas如何用分类均值DataFrame替换原表空值且不丢失分类为空的行
高效实现方案
方案1:基于map映射填充(你已提前生成df_mean的场景)
直接用你已经算好的均值表生成映射关系,全程向量化操作,200万行数据可秒级完成:
# 将df_mean转为【分类: 对应均值】的字典映射 mean_mapping = df_mean.set_index('main_category_en')['eco_score'].to_dict() # 仅对符合条件的空值做填充 df['eco_score'] = df['eco_score'].fillna(df['main_category_en'].map(mean_mapping))
该逻辑完全匹配你的需求:
- 若
main_category_en为NaN,map返回结果为NaN,fillna不会修改该行原有eco_score的值,不会丢失行 - 若
eco_score本身非空,fillna不会做任何修改 - 若分类不在均值表中,同样不会修改原有空值,和你的循环逻辑完全一致
方案2:无需提前生成df_mean的一步实现方案
如果不需要单独保留均值表,可以直接用分组transform完成计算+填充:
df['eco_score'] = df['eco_score'].fillna(df.groupby('main_category_en')['eco_score'].transform('mean'))
原循环效率低的原因
逐行遍历是Python层级的循环,每次索引取值、判断、赋值都要跨Python和pandas底层接口,200万行数据处理自然耗时极长。上述方案均为pandas底层C实现的向量化操作,性能是Python循环的数百上千倍。
内容的提问来源于stack exchange,提问作者Rococo
相关产品推荐
相关产品推荐

