1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        ?用 Python 讓 Excel 表格合并飛起來

        共 3502字,需瀏覽 8分鐘

         ·

        2021-03-11 11:02

        來源:Python數(shù)據(jù)之道

        作者:Lee

        問題提出

        我們在工作中經(jīng)常會遇到如下情況,從不同部門或者不同單位收集到若干個表格,每個表格的內容相同(列內容一致),需要將他們匯總到同一個表格中。Python 作為數(shù)據(jù)分析的神器,只需要簡單行代碼就可以讓表格合并飛起來,并且代碼可以多次復用。

        解法1

        用 Python 循環(huán)進行自動合并

        閑話少說,直接上代碼了。

        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 是第二行。

        這個操作優(yōu)點是簡單易懂,學幾天 Python 就可以搞的定( Python 上手確實太太太容易了),適用于表格行數(shù)比較少的情況;缺點是比較耗時,如果行數(shù)比較多(比如我使用的是 5W 行),上個廁所回來還沒運行完。

        解法2

        Python多進程操作

        歲月雖漫長,但也耐不住時光如梭,多快好省才是硬道理。

        程序要做的是兩件事兒:(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)

        運行結果如下:

        分析發(fā)現(xiàn),時間主要浪費在打開文件上了,因此用多進程一次多打開幾個,理論上來說是可以節(jié)省時間的,說干就干:

        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 中就不大現(xiàn)實了。這個時候,我們可以通過把數(shù)據(jù)放入到數(shù)據(jù)庫中進行解決,有興趣的小伙伴可以自己嘗試下。

        瀏覽 58
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            极品美女av | 国产三级农村妇女在线观看 | 18禁 网站 | 7799天天综合网,精品 | 免费看成人AAAAA视频在线 | 欧美一区二区三区电影 | 1000部处女破处视频 | 爆肏熟妇视频 | 国产美女高潮视频A片一区 | 啪啪啪啪网址 |