Python讀取大量Excel檔案並跨檔案批次計算平均值

瘋狂學習GIS發表於2023-02-01

  本文介紹基於Python語言,實現對多個不同Excel檔案進行資料讀取與平均值計算的方法。

  首先,讓我們來看一下具體需求:目前有一個資料夾,其中存放了大量Excel檔案;檔名稱是每一位同學的名字,即檔名稱沒有任何規律。

  而每一個檔案都是一位同學全班除了自己之外的其他同學的各項打分,我們以其中一個Excel檔案為例來看:

  可以看到,全班同學人數(即表格行數)很多、需要打分的專案(即表格列數)有11個(不算總分);同時,由於不能給自己打分,導致每一份表格中會有一行沒有資料。

  而我們需要做的,就是求出每一位同學的、11個打分專案分別的平均分,並存放在一個新的、表頭(行頭與列頭)與大家打分檔案一致的總檔案中,如下圖。其中,每一個格子都代表了這位同學、這一項打分專案在經過班級除其之外的每一位同學打分後計算出的平均值。

  可以看到,一個人就需要算11次平均,更何況一個班會有數十位同學。如果單獨用Excel計算,是非常麻煩的。

  而藉助Python,就會簡單很多。具體程式碼如下。在這裡,就不再像平日裡機器學習、深度學習程式碼部落格那樣,對程式碼加以逐段、分部分的具體解釋了,直接列出全部程式碼,大家參考註釋即可理解。

# -*- coding: utf-8 -*-
"""
Created on Thu Apr  8 16:24:41 2021

@author: fkxxgis
"""

import os
import numpy as np
from openpyxl import load_workbook

file_path='F:/班長/2020-2021綜合測評與評獎評優/01_綜合測評/地信XXXX班互評打分表/' #這裡是每一位同學打分Excel檔案存放的路徑
output_path='F:/班長/2020-2021綜合測評與評獎評優/01_綜合測評/地信XXXX班綜合素質測評互評打分表.xlsx' #這裡是最終結果存放路徑,請不要和上述路徑一致
first_row=5 #第一個分數所在的行數
first_column=3 #第一個分數所在的列數
all_row=32 #班級同學總數
all_column=11 #需要計算的分數專案個數

all_excel=os.listdir(file_path) #獲取打分檔案路徑下全部Excel檔案
file_row=first_row+all_row-1
file_column=first_column+all_column-1
all_mean_score=np.zeros((file_row,file_column),dtype=float) #新建一個二維陣列,存放每一位同學、每一項專案的分數平均值
for now_row in range(first_row,file_row+1):
    for now_column in range (first_column,file_column+1):
        all_score=[]
        for excel_num in range(0,len(all_excel)):
            now_excel=load_workbook(file_path+all_excel[excel_num]) #開啟第一個打分Excel檔案
            all_sheet=now_excel.get_sheet_names() #獲取打分檔案的全部Sheet名稱
            now_sheet=now_excel.get_sheet_by_name(all_sheet[0]) #本文中分數全部儲存於第一個Sheet,因此下標為0
            single_score=now_sheet.cell(now_row,now_column).value #獲取對應單元格資料
            if single_score==None: #如果這個單元格為空(也就是自己不給自己打分的那一行)
                pass
            else:
                all_score.append(single_score)
        all_mean_score[now_row-1,now_column-1]=np.mean(all_score) #計算全部同學為這一位同學、這一個打分專案所打分數的平均值

output_excel=load_workbook(output_path) #讀取結果存放Excel
output_all_sheet=output_excel.get_sheet_names() #這裡程式碼含義同上
output_sheet=output_excel.get_sheet_by_name(output_all_sheet[0])
output_sheet=output_excel.active
for output_now_row in range(first_row,file_row+1):
    for output_now_column in range (first_column,file_column+1):
        exec("output_sheet.cell(output_now_row,output_now_column).value=all_mean_score[output_now_row-1,output_now_column-1]") #將二維陣列中每一位同學、每一項打分專案的最終平均分數寫入結果檔案的對應位置
output_excel.save(output_path)

  至此,大功告成。

相關文章