Python读取CSV文件调用mean函数报'mean requires at least one data point'排查
报错原因排查
直接报错原因
你触发的statistics.StatisticsError: mean requires at least one data point错误,本质是调用mean()时传入的diff数组为空,没有有效数据可以计算平均值。
根因分析
csv.reader是迭代器类型,只能遍历一次,遍历完成后指针会停在文件末尾,再次遍历不会返回任何数据- 你代码存在两个逻辑问题导致
diff为空:- 多余的外层
for row in csvreader:循环:外层循环先消耗了csvreader的第一行数据,之后内层的amounts = [int(row[1]) for row in csvreader]会把剩余迭代器内容全部扫完,等外层第二次循环时迭代器已经为空,amounts会变成空数组,最终生成的diff自然为空 - 你注释的月份计算逻辑和金额计算逻辑是两次独立遍历迭代器:如果放开注释的月份计算代码,迭代器会被第一次遍历耗尽,后续的金额计算逻辑拿到的就是空数组,这就是你分开注释两部分代码都能正常运行,合在一起就报错的核心原因
- 多余的外层
修复方案
你不需要套外层的for循环,且只需要遍历一次csvreader同时存储月份和金额即可,修正后代码如下:
import csv from statistics import mean PyBank_file=r"PyBank\Resources\budget_data.csv" with open(PyBank_file, 'r') as csvfile: csvreader=csv.reader(csvfile,delimiter=',') # 如果你的csv文件没有表头,可删除下面这行跳过表头的代码 next(csvreader) # 一次遍历同时存储月份和金额,避免多次消耗迭代器 months = [] amounts = [] for row in csvreader: months.append(row[0]) amounts.append(int(row[1])) Total_Months=len(months) Total_Profits_Losses=sum(amounts) diff=[amounts[i+1]-amounts[i] for i in range(len(amounts)-1)] Average=mean(diff) Greatest_Increase=max(diff) Greatest_Decrease=min(diff) print(Total_Months) print(Total_Profits_Losses) print(Average) print(Greatest_Increase) print(Greatest_Decrease)
内容的提问来源于stack exchange,提问作者Nazih B.
相关产品推荐
相关产品推荐

