Python中处理CSV数据并计算指定列平均值的教程(不使用Pandas)

DDD
发布: 2025-09-26 14:13:15
原创
907人浏览过

python中处理csv数据并计算指定列平均值的教程(不使用pandas)

本教程旨在指导Python初学者,如何在不依赖Pandas库的情况下,从CSV文件中读取数据并计算特定数值列的平均值。文章重点解决常见的IndexError问题,通过介绍正确的列表初始化方法和数据解析策略,确保代码的健壮性和可扩展性,即使数据行数或列数发生变化也能正常工作。

在Python中处理CSV(或类似表格)数据并计算特定列的平均值是一个常见的任务。对于习惯C语言等静态类型语言的开发者来说,Python列表(list)的动态特性有时会带来困惑,尤其是在尝试修改尚未存在的列表元素时,容易遇到IndexError: list index out of range。本教程将详细阐述如何正确地实现这一功能,并提供一个健壮的代码示例。

理解 IndexError 的根源

当我们在Python中创建一个空列表 averages = [] 后,如果尝试通过索引直接对其元素进行赋值或累加,例如 averages[i] += value,Python会因为该索引 i 处没有元素而抛出 IndexError。列表的索引只能用于访问或修改 已存在的 元素。要向列表中添加新元素,应该使用 append() 方法;而要对特定位置的元素进行累加操作,则必须确保该位置的元素已经存在。

核心解决方案:列表预初始化

解决 IndexError 的关键在于,在进行累加操作之前,预先初始化 averages 列表,使其包含足够数量的元素(通常是0),以对应需要计算平均值的列数。

假设我们有 N 列需要计算平均值,正确的初始化方式是:

立即学习Python免费学习笔记(深入)”;

序列猴子开放平台
序列猴子开放平台

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

序列猴子开放平台 0
查看详情 序列猴子开放平台
num_columns_to_average = N
averages_sum = [0.0] * num_columns_to_average # 使用浮点数0.0,避免后续类型转换问题
登录后复制

这样,averages_sum 列表就会被创建为 [0.0, 0.0, ..., 0.0],其中包含 N 个0.0,从而允许我们通过 averages_sum[i] += value 的方式安全地进行累加。

实现步骤与代码示例

我们将通过一个具体的例子来演示如何从一个类似CSV的文件中读取数据,并计算指定数值列的平均值。假设我们的数据文件 RADIOLOGY.csv 格式如下(第一行是标题,第一列是序号,后续是数值数据):

Sr    JAN FEB MAR APR
1   2317    5327    997 986
2   2605    5617    1085    1105
...
登录后复制

1. 文件读取与数据解析

首先,我们需要打开并读取文件。由于本例中数据是空格分隔的,我们可以使用 file.readlines() 读取所有行,然后对每行使用 split() 方法进行解析。

import os

# 模拟文件内容,实际应用中会从文件中读取
# 为了教程的独立性,这里使用字符串数据
DATA_CONTENT = """Sr    JAN FEB MAR APR
1   2317    5327    997 986
2   2605    5617    1085    1105
3   2364    5490    1061    998
4   2975    6236    1129    1164
5   2766    5877    1206    1104
6   2762    6058    1295    908
7   3020    6602    1274    1089
8   2576    5644    1091    1041
9   3329    6643    1396    1130
10  2989    6284    1330    1192
"""

def read_data_from_string(data_string):
    """
    从字符串中读取数据行,并去除空行。
    在实际应用中,这里会替换为文件读取逻辑。
    """
    return [line.strip() for line in data_string.split('\n') if line.strip()]

def compute_column_averages(data_lines):
    """
    计算给定数据行中数值列的平均值。
    假设:
    1. 第一行是标题行。
    2. 第一列是标识符(不参与平均值计算)。
    3. 后续列是需要计算平均值的数值数据。
    4. 数据以空格分隔。
    """
    if not data_lines:
        return [], 0, []

    # 解析标题行以确定列数
    headers = data_lines[0].split()
    # 需要计算平均值的列数 = 总列数 - 1 (减去标识符列)
    # 注意:这里假设标题行和数据行有相同的列数结构
    num_columns_to_average = len(headers) - 1

    # 预初始化平均值累加器,所有元素设为0.0
    averages_sum = [0.0] * num_columns_to_average

    # 记录实际参与计算的行数
    data_row_count = 0

    # 遍历数据行,跳过标题行 (data_lines[1:])
    for row_index, line in enumerate(data_lines[1:]):
        values_str = line.split()

        # 确保行有足够的列
        # 需要的列数是 num_columns_to_average (数据列) + 1 (标识符列)
        if len(values_str) < num_columns_to_average + 1:
            print(f"警告: 第 {row_index + 2} 行数据不完整,跳过。内容: '{line}'")
            continue

        # 遍历需要计算平均值的列(从第二个元素开始,即索引1)
        for col_idx in range(num_columns_to_average):
            try:
                # values_str[col_idx + 1] 是实际的数值列
                averages_sum[col_idx] += float(values_str[col_idx + 1])
            except ValueError:
                print(f"警告: 第 {row_index + 2} 行第 {col_idx + 2} 列 '{values_str[col_idx + 1]}' 不是有效数字,跳过此值。")
                # 如果遇到非数字值,我们选择跳过该值,但仍将该行计入总行数
                # 实际应用中可能需要更复杂的策略,例如跳过整行或用0填充
                continue 

        data_row_count += 1 # 只有有效数据行才计入总行数

    # 计算最终平均值
    final_averages = []
    if data_row_count > 0:
        for i in range(num_columns_to_average):
            final_averages.append(averages_sum[i] / data_row_count)
    else:
        print("没有足够的有效数据行来计算平均值。")

    return final_averages, num_columns_to_average, headers[1:] # 返回平均值列表、列数和对应的标题

def main_driver():
    # 1. 读取数据
    # 实际文件读取示例:
    # file_path = "RADIOLOGY.csv"
    # try:
    #     with open(file_path, 'r', encoding='utf-8') as f:
    #         data_lines = read_data_
登录后复制

以上就是Python中处理CSV数据并计算指定列平均值的教程(不使用Pandas)的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号