如何使用pandas过滤大型CSV文件并计算过滤值的平均值
大型CSV过滤+数值均值计算实现方案
数十万行规模的CSV用pandas处理完全不需要额外工具,根据你的内存情况选对应方案即可。
方案1:内存可承载全量文件(优先选,代码最简单)
几十万行常规结构的CSV体积一般在几十到数百MB,普通消费级PC内存完全可以承载,操作步骤如下:
- 读文件时只加载你实际要用的列,同时指定合适的列类型压缩内存,不要无脑全量读入
- 用pandas向量化逻辑做行过滤,不要用逐行循环或者apply,性能差距可达两个数量级
- 直接对过滤后数据集的目标列调用mean方法算均值
参考代码:
import pandas as pd # 替换成你自己的文件路径、列名、过滤规则 df = pd.read_csv( "your_data.csv", # 只加载过滤、计算需要的列,无关列不读 usecols=["filter_col", "calc_num_col"], # 指定列类型减少内存占用,类别型字段设为category,数值按需选精度 dtype={"filter_col": "category", "calc_num_col": "float32"} ) # 按行值过滤,多条件判断每个条件要单独加括号,用&表且、|表或,不要用原生and/or filtered_data = df[ (df["filter_col"] == "target_val") & (df["calc_num_col"] > 0) ] # 计算均值 avg_res = filtered_data["calc_num_col"].mean() print(f"过滤后数值均值:{avg_res}")
注意:如果过滤后没有符合条件的行,mean方法会返回nan,注意做空值判断
方案2:内存不足加载全量文件(列数极多/文件体积超2G时用)
如果文件列特别多、体积太大没法一次性读进内存,就用pandas的分块读取能力,逐块过滤、累计统计量,全程内存占用可控:
参考代码:
import pandas as pd chunk_size = 10000 # 每次读取的行数,可根据内存大小调整,建议5000-50000区间 total_sum = 0 # 累计符合条件的数值总和 valid_count = 0 # 累计符合条件的行数 for chunk in pd.read_csv( "your_data.csv", usecols=["filter_col", "calc_num_col"], dtype={"filter_col": "category", "calc_num_col": "float32"}, chunksize=chunk_size ): # 对当前块做和方案1一致的过滤 chunk_filtered = chunk[ (chunk["filter_col"] == "target_val") & (chunk["calc_num_col"] > 0) ] # 累加当前块的统计值 total_sum += chunk_filtered["calc_num_col"].sum() valid_count += len(chunk_filtered) if valid_count == 0: print("无符合过滤条件的数据,无法计算均值") else: avg_res = total_sum / valid_count print(f"过滤后数值均值:{avg_res}")
性能优化提示
- 过滤逻辑尽量用pandas内置的向量化方法,比如字符串匹配用
str.contains/str.match,数值判断直接用比较运算符,不要写逐行apply逻辑 - 数值列如果不需要双精度,优先用float32代替默认float64,整数列根据取值范围选int32/int16,内存占用可以直接减半
- 类别型的过滤字段优先设为category类型,既省内存又能加快过滤速度
内容的提问来源于stack exchange,提问作者Cys
相关产品推荐
相关产品推荐

