原标题:用 Python 让 Excel 表格合并飞起来
来源:Python数据之道
作者:Lee
用 Python 让 Excel 表格合并飞起来
问题提出
我们在工作中经常会遇到如下情况,从不同部门或者不同单位收集到若干个表格,每个表格的内容相同(列内容一致),需要将他们汇总到同一个表格中。Python 作为数据分析的神器,只需要简单行代码就可以让表格合并飞起来,并且代码可以多次复用。
解法1用 Python 循环进行自动合并
闲话少说,直接上代码了。
importpandas aspd
importtime
filelist = [ 'c:/python/aSourseFiles/bi/bi ('+ str(i+ 1) + ').xlsx'fori inrange( 40)] #需要打开的文件列表,如果要自己运行代码,找一个excel复制40遍再重命名就行了。
start = time.time #用于计时。
df = pd.read_excel(filelist[ -1]) #以最后一个文件为基础进行合并操作
fori inrange( 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)将打开的文件合并在一起。我们先运行一小段代码测试下这两个功能各自的时耗。
importtime
importpandas aspd
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)
运行结果如下:
分析发现,时间主要浪费在打开文件上了,因此用多进程一次多打开几个,理论上来说是可以节省时间的,说干就干:
importpandas aspd
importtime
frommultiprocessing importPool
filelist = [ 'c:/python/aSourseFiles/bi/bi ('+ str(i+ 1) + ').xlsx'fori inrange( 40)]
defread_excel(path):
temp = pd.read_excel(path)
print( 'running')
returntemp
defmerge_excel(temp):
globaldf
df = pd.concat([df, temp])
if__name__ == '__main__':
start = time.time
df = pd.read_excel(filelist[ -1]) #以最后一个文件为基础进行合并操作
p1 = Pool( 8) #生成8个进程
fori inrange( 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 中就不大现实了。这个时候,我们可以通过把数据放入到数据库中进行解决,有兴趣的小伙伴可以自己尝试下。
文末福利
考拉收集了 21 张 Python 代码速查表,每一张都是国外的大师总结的,非常实用 ~
还有 2 张高清的 PyCharm 快捷键一览图,一张 Windows,一张 Mac,放在桌面上,需要的时候打开一查,非常方便。。
怎么获取呢?
关注编程派公众号,回复关键词「 f」获取
题图:pexels,CC0 授权返回搜狐,查看更多
责任编辑: