我們在工作中經常會遇到如下情況,從不同部門或者不同單位收集到若干個表格,每個表格的內容相同(列內容一致),需要將他們匯總到同一個表格中。Python 作為數據分析的神器,只需要簡單行代碼就可以讓表格合併飛起來,並且代碼可以多次復用。
解法1用 Python 循環進行自動合併閒話少說,直接上代碼了。
import pandas as pd
import time
filelist = ['c:/python/aSourseFiles/bi/bi (' + str(i+1) + ').xlsx' for i in range(40)] #需要打開的文件列表,如果要自己運行代碼,找一個excel複製40遍再重命名就行了。
start = time.time() #用於計時。
df = pd.read_excel(filelist[-1]) #以最後一個文件為基礎進行合併操作
for i in range(39): #將其餘39個文件與最後一個合併
df = pd.concat([df, pd.read_excel(filelist[i])])
print(i)
end = time.time()
run_time = end - start
print('本次運行耗時%.02f' %(run_time))運行結果如下:
PS:我們的 Excel 表一般是附帶表頭的,合併的時候是從某行開始,例如,我們需要從第二行開始時,只需改為 pd.read_excel(filelist[i])[1:] ,注意 0 才是第一行, 1 是第二行。
這個操作優點是簡單易懂,學幾天 Python 就可以搞的定( Python 上手確實太太太容易了),適用於表格行數比較少的情況;缺點是比較耗時,如果行數比較多(比如我使用的是 5W 行),上個廁所回來還沒運行完。
解法2Python多進程操作歲月雖漫長,但也耐不住時光如梭,多快好省才是硬道理。
程序要做的是兩件事兒:(1)打開文件;(2)將打開的文件合併在一起。我們先運行一小段代碼測試下這兩個功能各自的時耗。
import time
import pandas as pd
start = time.time()
df1 = pd.read_excel(r'c:/python/aSourseFiles/bi/bi (1).xlsx')
df2 = pd.read_excel(r'c:/python/aSourseFiles/bi/bi (2).xlsx')
df3 = pd.read_excel(r'c:/python/aSourseFiles/bi/bi (3).xlsx')
median = time.time()
df = pd.concat([df1, df2, df3])
end = time.time()
use1 = median - start #計算打開文件耗時
use2 = end - median #計算合併表格耗時
print(use1)
print(use2)運行結果如下:
分析發現,時間主要浪費在打開文件上了,因此用多進程一次多打開幾個,理論上來說是可以節省時間的,說幹就幹:
import pandas as pd
import time
from multiprocessing import Pool
filelist = ['c:/python/aSourseFiles/bi/bi (' + str(i+1) + ').xlsx' for i in range(40)]
def read_excel(path):
temp = pd.read_excel(path)
print('running')
return temp
def merge_excel(temp):
global df
df = pd.concat([df, temp])
if __name__ == '__main__':
start = time.time()
df = pd.read_excel(filelist[-1]) #以最後一個文件為基礎進行合併操作
p1 = Pool(8) #生成8個進程
for i in range(39):
p1.apply_async(read_excel, args=(filelist[i],), callback=merge_excel) #將打開文件的任務放入到進程中,完成任務時回調merge_excel進行合併
p1.close()
p1.join()
print(df.shape)
end = time.time()
run_time = end - start
print('本次運行耗時%.02f' %(run_time))運行結果如下:
果然是比之前快了些,上個廁所回來就可以拿到結果了。
拓展這段代碼依舊是有點雞肋。40 個excel,每個 5W 行,合計 200W 行,合併完再放進 Excel 中就不大現實了。這個時候,我們可以通過把數據放入到資料庫中進行解決,有興趣的小夥伴可以自己嘗試下。
本文來自公眾號讀者投稿,歡迎各位童鞋向公號投稿,點擊下面圖片了解詳情!