如何加速含fillna、grouping、transform的缺失值填充函数?
优化按时间维度填充缺失值的函数
原函数性能瓶颈分析
原函数依赖lambda和x.apply(function)触发大量逐元素的Python层面操作,加上多次分组与重复填充,导致运行效率低下。以下是基于pandas向量化操作的优化方案,全程避免Python循环和条件语句。
优化后的代码
import pandas as pd def fillna_date_optimized(data, function='mean'): # 映射聚合函数到pandas内置向量化方法 agg_func_map = { 'mean': pd.Series.mean, 'max': pd.Series.max, 'min': pd.Series.min, 'median': pd.Series.median } agg_func = agg_func_map[function] d = data.copy() d.index = pd.to_datetime(d.index) # 计算各维度聚合值并匹配到原数据行 monthly_agg = d.groupby([d.index.year, d.index.month]).transform(agg_func) yearly_agg = d.groupby(d.index.year).transform(agg_func) col_agg = d.apply(agg_func).reindex(d.index).ffill() # 按优先级填充:月度→年度→整列 filled_data = d.combine_first(monthly_agg).combine_first(yearly_agg).combine_first(col_agg) return filled_data
优化说明
- 向量化聚合替代Python层面操作:通过预定义函数映射,直接调用pandas内置的向量化聚合方法,彻底避免
lambda和apply带来的性能损耗。 - 合并填充逻辑:用
combine_first按优先级依次填充,替代原函数多次fillna的重复操作,减少数据复制与中间变量生成。 - 高效索引对齐:利用
transform直接将分组聚合值匹配到原数据对应行,无需额外手动对齐索引。
内容的提问来源于stack exchange,提问作者user20423494
相关产品推荐
相关产品推荐

