Python实现从CSV提取数据并计算2016年各地点平均降雪量写入新CSV
嘿,我来帮你搞定这个问题!你遇到的麻烦大概率是因为边读边写的同时没做好数据分组统计——毕竟要先把2016年所有地点的降雪数据都收集齐,才能算出准确的平均值,而不是读一行就处理一行。下面我给你两种可靠的解决方案,你可以根据自己的习惯选择:
方法一:用Python标准库csv实现(适合基础场景)
这种方法不需要额外安装库,逻辑清晰,适合新手理解:
import csv from collections import defaultdict # 第一步:先收集2016年所有地点的降雪数据 location_snow_data = defaultdict(list) # 先单独读取原始数据,按地点分组存储降雪量 with open('filteredData.csv', 'r', newline='', encoding='utf-8') as input_file: reader = csv.DictReader(input_file) for row in reader: # 注意:这里的列名要和你的CSV文件实际列名一致,比如"年份""地点""降雪量" if row['年份'] == '2016': try: # 把降雪量转成数字,避免非数值数据干扰 snowfall = float(row['降雪量']) location = row['地点'] location_snow_data[location].append(snowfall) except ValueError: # 遇到无效数据时跳过并提示,避免程序崩溃 print(f"跳过无效数据行:{row}") # 第二步:计算每个地点的平均降雪量 average_results = {} for location, snow_values in location_snow_data.items(): if snow_values: # 确保该地点有有效数据才计算 average = sum(snow_values) / len(snow_values) average_results[location] = round(average, 2) # 保留两位小数,可按需调整 # 第三步:把结果写入新文件 with open('average2016.csv', 'w', newline='', encoding='utf-8') as output_file: writer = csv.DictWriter(output_file, fieldnames=['地点', '2016年平均降雪量']) writer.writeheader() # 写入表头 for location, avg_snow in average_results.items(): writer.writerow({'地点': location, '2016年平均降雪量': avg_snow})
方法二:用pandas实现(简洁高效,适合数据量较大的场景)
如果你已经安装了pandas,几行代码就能搞定,非常省心:
import pandas as pd # 读取原始数据并筛选2016年的记录 df = pd.read_csv('filteredData.csv') df_2016 = df[df['年份'] == 2016] # 按地点分组计算平均降雪量,重置索引并修改列名 average_df = df_2016.groupby('地点')['降雪量'].mean().round(2).reset_index() average_df.columns = ['地点', '2016年平均降雪量'] # 写入结果到新CSV,不保留索引列 average_df.to_csv('average2016.csv', index=False, encoding='utf-8')
你原来的做法可能踩的坑:
- 边读原始文件边写结果文件,导致某个地点的后续数据还没读到就提前写入了错误的平均值;
- 没有对数据做分组存储,每遇到一个地点就直接计算,但忽略了后续同地点的降雪数据;
- 没处理非数字的降雪量数据,导致计算时出现报错。
记得根据你CSV文件里的实际列名,修改代码中的年份、地点、降雪量这些字段名哦!
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

