日常的数据分析工作中,很多时候我们会通过excel的形式将分析结果展示给领导或同事。前面一些文章我们也简单提到过pandas与excel的i/o问题,今天我们再深入一步,如何将多个分析后的结果,也就是多个DataFrame,写入同一个excel工作簿中呢?
直奔主题。
先导入包,然后用字典构建一个测试用的DF:
然后让它繁衍一下,复制几个同样的DF出来待用:
之前说到过,用Python的pandas包把数据结构写入excel,主要用到的是pd.to_excel()。然而比较尴尬的是,这个方法缺少了一个类似pd.to_csv()中的mode参数,以至于你每次用诸如pd.to_excel(文件名)的形式去写入excel时,系统都会帮你重新创建一个新的文件。也就意味着前面的文件会被覆盖掉,你得到的只能是最后一个DF写入的结果文件。
那么,有其他的办法,让好几个DF写入到同一个excel文件中吗?
如果这样常见的问题都没法解决的话,人生苦短,我用Python也就白说这么多年了。我们可以通过创建一个ExcelWriter对象,来完美解决上面的问题。代码如下:
这个写入对象,会帮我们将DF写入到test1这个excel工作簿中。
接下来我们依次将之前创建和繁衍好的DF写入到df1到df4这四个工作表中,如下:
到这里,有的朋友发现问题了,为什么我运行完代码,还是没有看到创建的excel工作簿呢?实际上,上面那一步做完,数据还只是存在于缓存中,需要我们再运行下面一句代码,数据才能写入到硬盘中:
我们打开新鲜出炉的test1文件来检查一下,发现一共有四个工作表,表里头的数据也跟我们写入的相同,没有出现错误:
另外,如果想把这四个DF都写在同一个工作簿的同一个工作表里,又该怎么办呢?
熟悉pd.to_excel()朋友不难想到,可以利用startcol和startrow这两个参数来实现:
如上,我们重新创建一个writer2对象,在将DF写入到excel的时候,并没有传递sheet_name参数,这也就意味着所有的DF都会默认写入到Sheet1里头。
为了防止DF都写入到工作表同一地方以至于出现重合情况,我们可以设置DF在写入时的起始行和起始列。如df1没有传递除writer2以外的任何参数,则会默认从Sheet1的第一行第一列开始写入数据。df2指定startcol=8,意即该DF在写入到Sheet1中时,会从第一行第九列(不是第八列开始,不明白这块的同学可以去官网看看这个参数到底是什么意思,好好理解一下Python和excel起始数字的不同之处!!!)开始写入数据。同样的,df3会从第11行第1列开始写入数据,df4会从第11行第9列写入数据。
接着writer2.save()一下,数据写入到硬盘,我们来检查一下:
呈现出的结果跟我们的需求是一样的。当然,格式方面,还需要自己再稍微调整一下。
最后说一个旧闻,据说微软已经考虑要把Python接纳为excel的操作脚本语言之一了。或许在不久的将来,除了vba之外,你还可以直接在excel里用Python来做一些自动化的事情了。想想还挺美,期待一下吧。