0

0

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

DDD

DDD

发布时间:2025-09-26 14:13:15

|

925人浏览过

|

来源于php中文网

原创

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免费学习笔记(深入)”;

Viggle AI
Viggle AI

Viggle AI是一个AI驱动的3D动画生成平台,可以帮助用户创建可控角色的3D动画视频。

下载
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开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

769

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

639

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1325

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 10.5万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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