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

在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学习网公众号,一起学习编程~
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
165 收藏
-
449 收藏
-
216 收藏
-
325 收藏
-
300 收藏
-
337 收藏
-
385 收藏
-
165 收藏
-
254 收藏
-
427 收藏
-
149 收藏
-
190 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习