在上次的推文中,我们介绍了使用Openpyxl来进行数据的过滤和排序的操作,
相关推文可以从本公众号的底部相关菜单获取。在那篇推文中我们使用到了Pandas。因此本次推文我们就来看一看Openpyxl和Numpy、Pandas结合使用是一个什么样的效果。
一.Numpy和Pandas简介
在科学计算和数据分析领域大家对Numpy和Pandas都不会太陌生。这里简单的介绍一下。Numpy是高性能科学计算的扩展包,它能高效处理高维数组,复杂函数。而Pandas是基于NumPy 的一种常用于数据处理和分析的工具,该工具是为了解决数据分析任务而创建的,Pandas模块提供了大量快速便捷地完成数据分析和处理工作的函数和方法。
二.结合pandas
假设现在我们有一个"np_pd_test.xlsx"文件,我们制造一个Pandas的DataFrame并写入到Excel中,我们来看一下:
2.1 DataFrame写入到Excel
import pandas as pd
import numpy as np
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
wbook = load_workbook(filename='np_pd_test.xlsx')
wsheet = wbook['Sheet1']
data = {'alpha': ['A', 'B', 'C', 'D', 'E', 'F'],
'num_1': [25, 32, 18, np.nan, 14, 15],
'num_2': [12, 15, 17, 18, 22, 23],
}
labels = ['a', 'b', 'c', 'd', 'e', 'f']
df = pd.DataFrame(data, index=labels)
for each in dataframe_to_rows(df, index=False, header=True):
wsheet.append(each)
wbook.save("np_pd_test.xlsx")
其中df的样式如下所示:
上述代码先构建了一个DataFrame,然后使用openpyxl.utils.dataframe中的dataframe_to_rows写入到Excel中,并保存。保存后的结果如下:
这仅仅是简单的将DataFrame中的数据写到Excel中,其实某一些时候我们也可以直接使用Pandas中to_excel函数进行相应的操作。
官网中说:使用这个方法会提供了代码更多的灵活性。我猜也是这样。
2.2 设置格式
另外在官网中,提供了一种cell的style的形式,只需要在最后一行加上如下代码,其他的代码不变:
for cell in wsheet['A'] + wsheet[1]:
cell.style = 'Pandas'
那么最后的结果就会显示如下,也就是说将header和lables设置成为“Pandas形式”的数据格式。标题和索引更加的凸显。
当然在...\site-packages\openpyxl\styles\builtins.py中有一个style字典记录了可以使用的style形式,部分截图如下:
大家可以尝试使用不同的格式看看有什么不同的效果。
另外在官方文档中介绍到了一个只写模式,这里我不就不介绍了,感兴趣的小伙伴可以去研究一下官方文档,具体的这个函数的实现如下:
def WriteOnlyCell(ws=None, value=None):
return Cell(worksheet=ws, column=1, row=1, value=value)
2.3 数据表转DataFrame
上面的操作是将数据写入到Excel的,那么怎么读取一块数据,然后将数据转换成Pandas的DataFrame呢?我们接着往下看。
学习过Pandas的小伙伴都知道将一个数据(比如说字典)转换为DataFrame的操作很简单(其中C表示字典):
Cover_data=DataFrame(C)
假设我们的源数据来自于表“np_pd_test.xlsx”的Sheet1,内容如下:
我们来执行以下代码:
import pandas as pd
from itertools import islice
from openpyxl import load_workbook
wbook = load_workbook('np_pd_test.xlsx')
wsheet = wbook['Sheet1']
data = wsheet.values
print('data:',data)
cols = next(data)[1:]
data = list(data)
idx = [r[0] for r in data]
data = (islice(r, 1, None) for r in data)
df = pd.DataFrame(data, index=idx, columns=cols)
print(cols)
print(df)
```)
我们先看上述print函数的输出是什么,如下:
data:
('num_1', 'num_2')
num_1 num_2
A 25.0 12
B 32.0 15
C 18.0 17
D NaN 18
E 14.0 22
F 15.0 23
第一行的输出为wsheet.values,也就是说这个值一个生成器对象(有关生成器的相关知识请查阅本公众号实用教程)。
第二行的输出一个元组,其值为DataFrame中的header,这种获取header的方式是一个小技巧,大家可以好好学习一下。
第三行的输出为一个DataFrame,其值就是我们得到的DataFrame。
大家对中间过程的输出不是很明白的话,可以把各个变量都打印出来,看看是什么样的。
**三.结合numpy**
上述介绍了很多openpyxl和Pandas想结合的一些操作,由于numpy与Pandas之间可以相互的转换,这里就不在赘言了,等后期遇到相应的需求,我们再继续拿一个很好的案例来阐述。如果有伙伴发现有很好的案例可以在微信公众号后台联系我哟。
**四.总结**
以上就是本次的推文,推文介绍的是在Excel中进行排序的相关操作,大家跟着学习的时候最好也跟着实践一下。后期我们将继续介绍其他方面的知识。大家在学习的时候有什么疑问或者发现有什么好的方法可以在文章评论告诉我们哦。