10万行级大矩阵计算列均值时pandas运行速度过慢的优化方案咨询
pandas大矩阵列均值计算性能优化方案
优化后代码如下:
import pandas as pd import numpy as np def filtering(data): # 统一转换数据类型为float32,消除object类型带来的计算开销 data = data.astype(np.float32, copy=False) # 一次性计算所有列的均值,矢量化操作效率远高于逐列计算 col_means = data.mean(axis=0) healthy = [] nmibc_hg = [] nmibc_lg = [] mibc_hg = [] # 仅遍历列名和已经算好的均值,无重复计算开销 for col_name, mean_val in col_means.items(): if 'HEALTHY' in col_name: healthy.append(mean_val) elif 'NMIBC_HG' in col_name: nmibc_hg.append(mean_val) elif 'NMIBC_LG' in col_name: nmibc_lg.append(mean_val) elif 'MIBC_HG' in col_name: mibc_hg.append(mean_val) return healthy, nmibc_hg, nmibc_lg, mibc_hg
核心优化点:
- 消除逐列计算的重复开销:原代码循环中每次单独调用单列mean方法,会产生大量重复的函数调用、数据读取开销,改为一次性计算全量列均值后,底层直接调用numpy矢量化运算,10万行80列的数据集计算耗时可以压缩到毫秒级。
- 解决数据类型导致的性能损耗:原代码耗时达到小时级的核心诱因大概率是DataFrame列为object类型,逐列计算均值时会反复做隐式类型转换,提前统一转换为float32类型(0~1的数值范围完全满足精度要求),既减少内存占用,也完全规避了类型转换开销。
- 简化判断逻辑:前面的分支已经过滤了所有包含
NMIBC_HG的列,最后一个MIBC_HG的判断不需要额外增加排除逻辑,减少不必要的字符串匹配开销。
补充说明:如果执行类型转换时报错,说明列中存在非数值格式的内容,可先通过pd.to_numeric(data[col], errors='coerce')批量处理列,将非法值转为空值后再计算均值即可。
内容的提问来源于stack exchange,提问作者Dolev
相关产品推荐
相关产品推荐

