用 Python 让 Excel 表格合并飞起来


问题提出

我们在工作中经常会遇到如下情况,从不同部门或者不同单位收集到若干个表格,每个表格的内容相同(列内容一致),需要将他们汇总到同一个表格中。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 行),上个厕所回来还没运行完。

解法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)

运行结果如下:分析发现,时间主要浪费在打开文件上了,因此用多进程一次多打开几个,理论上来说是可以节省时间的,说干就干:

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 中就不大现实了。这个时候,我们可以通过把数据放入到数据库中进行解决,有兴趣的小伙伴可以自己尝试下。

本文来自公众号读者投稿,欢迎各位童鞋向公号投稿,点击下面图片了解详情!



------- End -------

点右下角「在看」与转发是对柠檬数据最大的支持
回复「time」获取《Python时间使用指南
回复「SQL50」获取《SQL经典50题及答案

柠檬数据

发现数据价值,分享数据故事

扫码关注,查看更多内容


©著作权归作者所有:来自51CTO博客作者mb5fe18e7c44408的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Ansible 之 外部变量文件调用
  2. 用Python和Tableau对母婴商品销量进行数据分析(附Python源码及Tab
  3. Python处理文件的几个常用小知识
  4. centos 用户权限管理与文件权限设定 详解
  5. 有效解决U盘文件变成exe格式的方法
  6. linux文件目录结构汇总!Linux学习
  7. rsync和sersync实时同步文件
  8. 6、用户身份与文件权限
  9. 7、文件系统与磁盘划分

随机推荐

  1. C#中序列化的使用总结
  2. 对ASP.NET中的MVC引擎开发插系统进行详解
  3. 浅析Asp.Net使用Image/ImageButton空间显
  4. C#如何实现自动更新本地程序的实例分析
  5. 代码分析:在.Net Core中使用ref和Span<T>
  6. C#中关于Timer定时器重入问题的解决方法
  7. ASP.NET如何实现进度条效果的实例讲解
  8. MongoDB在.Net中的使用方法详解
  9. 对MVC进行数据验证详解
  10. C#中关于foreach遍历使用的深入理解