当前位置:首页 > 文章列表 > 文章 > python教程 > Python读取CSV计算平均值教程

Python读取CSV计算平均值教程

2025-10-03 09:21:29 0浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Python处理CSV数据并计算平均值教程》,聊聊,我们一起来看看吧!

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 列需要计算平均值,正确的初始化方式是:

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_

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

Win10删除用户账户步骤详解Win10删除用户账户步骤详解
上一篇
Win10删除用户账户步骤详解
HTML结构简化技巧与高效CSS选择器写法
下一篇
HTML结构简化技巧与高效CSS选择器写法
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3193次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3405次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3436次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4543次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3814次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码