You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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])
报错根因

问题和排序方案、数据类型无关,是代码本身的两个逻辑错误:

  1. 变量被意外覆盖:初始定义t_high为空列表用于存储全量列值,但for循环内直接用t_high = item["F532 Median"]赋值,每次循环都会把单个浮点型的列值覆盖掉原列表变量。循环结束后t_high仅保存了数据集最后一行的单个浮点数,并非存储所有值的列表,调用列表专属的.sort()方法自然会触发类型错误。
  2. 列表方法使用错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:45:40