Python处理CSV提取F532 Median列求最值报float无sort属性错误
问题描述
现有一份存储12.4万条不同样本中位数数据的CSV文件,已完成目标列F532 Median的提取与float类型转换,需要计算该列数据的均值、最大值、最小值。目前均值计算逻辑可正常运行,但最大值、最小值的计算始终触发报错,先后尝试三类实现方案均未解决问题:
- 对存储列数据的列表排序后取首元素作为最小值,触发报错:
'float' object has no attribute 'sort' - 将列值转换为字符串类型后再执行排序操作,报错仅将类型名从float替换为string
- 放弃排序实现思路,通过for循环遍历数据集计算最值,仍触发同类报错
原始报错代码
import csv from pathlib import Path def process_row(row): row["F532 Median"] = float(row["F532 Median"]) return row # File located in home directory file_path = Path.home()/"python_codes"/"253_Slide01_A1.csv" with file_path.open(mode="r",encoding="utf-8") as file: reader = csv.DictReader(file) row_information = [process_row(row) for row in reader] t_high = [] count = 0 sum1 = 0 for item in row_information: t_high = item["F532 Median"] sum1 += t_high count += 1 avg = sum1 / count sort_list = t_high.sort() print(sort_list[0])
报错根因
问题和排序方案、数据类型无关,是代码本身的两个逻辑错误:
- 变量被意外覆盖:初始定义
t_high为空列表用于存储全量列值,但for循环内直接用t_high = item["F532 Median"]赋值,每次循环都会把单个浮点型的列值覆盖掉原列表变量。循环结束后t_high仅保存了数据集最后一行的单个浮点数,并非存储所有值的列表,调用列表专属的.sort()方法自然会触发类型错误。 - 列表方法使用错误:Python中列表的
.sort()是原地排序方法,执行后直接修改原列表顺序,返回值为None。即使t_high是正常的全量数据列表,将.sort()的返回值赋值给sort_list后,sort_list是空值None,后续取索引元素也会触发新的报错。
修复方案
方案1:修正列表逻辑实现
修复变量覆盖和sort方法的用法问题即可正常运行,代码如下:
import csv from pathlib import Path def process_row(row): row["F532 Median"] = float(row["F532 Median"]) return row file_path = Path.home()/"python_codes"/"253_Slide01_A1.csv" with file_path.open(mode="r", encoding="utf-8") as file: reader = csv.DictReader(file) row_information = [process_row(row) for row in reader] t_high = [] count = 0 sum1 = 0 for item in row_information: val = item["F532 Median"] # 追加值到列表,而非覆盖列表变量 t_high.append(val) sum1 += val count += 1 # 循环结束后统一计算均值,避免循环内重复计算浪费性能 avg = sum1 / count # 直接对原列表做原地排序,不需要接收返回值 t_high.sort() min_val = t_high[0] max_val = t_high[-1] print(f"均值:{avg:.4f}, 最小值:{min_val}, 最大值:{max_val}")
方案2:遍历过程直接计算最值(更省内存)
针对12万条数据的场景,不需要额外存储全量列值,遍历过程中同步维护最值变量即可,内存占用更低、运行效率更高:
import csv from pathlib import Path def process_row(row): row["F532 Median"] = float(row["F532 Median"]) return row file_path = Path.home()/"python_codes"/"253_Slide01_A1.csv" with file_path.open(mode="r", encoding="utf-8") as file: reader = csv.DictReader(file) row_information = [process_row(row) for row in reader] count = 0 sum1 = 0 min_val = None max_val = None for item in row_information: val = item["F532 Median"] sum1 += val count += 1 # 同步更新最值 if min_val is None or val < min_val: min_val = val if max_val is None or val > max_val: max_val = val avg = sum1 / count print(f"均值:{avg:.4f}, 最小值:{min_val}, 最大值:{max_val}")
内容的提问来源于stack exchange,提问作者Johnny Montana
相关产品推荐
相关产品推荐

