如何用Pandas批量处理多份CSV文件并计算学生平均成绩
合并多个CSV文件并按学生ID计算平均成绩
我来帮你搞定这个需求!你需要将三个记录作业成绩的CSV文件合并,按Student id分组计算Mark的平均值,同时保留学生的其他附加字段。这里默认一个前提:每个学生的附加字段(extra fields)在所有文件里是一致的,这样我们可以安全地保留这些字段。
下面是比逐行遍历更高效简洁的实现步骤:
1. 批量读取并合并所有CSV文件
先把所有CSV文件的路径整理成列表,用pandas.concat()一次性合并成一个大的DataFrame,不用单独处理每个文件:
import pandas as pd # 把你的三个CSV文件路径放到这里 csv_paths = ['first.csv', 'second.csv', 'third.csv'] # 批量读取并合并所有文件 combined_df = pd.concat([pd.read_csv(path) for path in csv_paths], ignore_index=True)
2. 按学生ID分组计算平均分并保留附加字段
接下来按Student id分组,对Mark列计算平均值,其他附加字段因为每个学生是唯一的,我们取每组里的第一个值(或者最后一个,结果都一样):
# 定义聚合规则:Mark取平均值,其他字段取第一个出现的值 agg_rules = { 'Mark': 'mean', } # 自动把其他字段加入聚合规则,取第一个值 for col in combined_df.columns: if col not in ['Student id', 'Mark']: agg_rules[col] = 'first' # 执行分组聚合 result_df = combined_df.groupby('Student id', as_index=False).agg(agg_rules) # 把平均分的列名改成你要的`average`,并调整列顺序 result_df.rename(columns={'Mark': 'average'}, inplace=True) # 确保Student id和average排在最前面 final_cols = ['Student id', 'average'] + [col for col in combined_df.columns if col not in ['Student id', 'Mark']] result_df = result_df[final_cols]
3. 输出或保存结果
最后可以打印结果,或者保存成新的CSV文件:
# 打印结果 print(result_df) # 保存到新的CSV文件(不保留索引) result_df.to_csv('student_average_scores.csv', index=False)
为什么不推荐逐行遍历?
你之前用iterrows()的方法虽然能实现,但Pandas的矢量化操作(比如分组聚合)效率要高得多,尤其是数据量大的时候,而且代码更简洁易维护,后续如果要加更多CSV文件,只要在csv_paths里加路径就行,不用改其他代码。
如果你的附加字段在不同文件里有可能不一致,那可以提前处理冲突(比如标记差异、取众数等),不过从你的示例来看,应该每个学生的附加字段是固定的,上面的方法完全适用。
内容的提问来源于stack exchange,提问作者Jose Ramon
相关产品推荐
相关产品推荐

