在Python中,可以使用xlwings模块和Pandas模块相结合的方式处理比较复杂的Excel文档。Pandas(Python Data Analysis Library)是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。
由于Pandas模块是第三方模块,所以需要安装此模块。安装Pandas模块需要在Windows命令行窗口中输入的命令如下:
pip install pandas-i https://pypi.tuna.tsinghua.edu.cn/simple
然后按Enter键,即可安装Pandas模块,如图1—33所示。
图1—33 安装Pandas模块
Pandas是一个开源的第三方Python库,从NumPy和Matplotlib的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。Pandas已经成为Python数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具。
Pandas模块是采用面向对象的思想编写而成的。可以创建3种对象(Series、DataFrame、Panel)。这3种对象分别用于处理不同类型的数据结构,具体的数据结构见表1—9。
表1—9 Pandas模块创建的对象
在Pandas模块中,可以使用函数pandas.Series()创建Series对象,其语法格式如下:
import pandas as pd series1=pd.Series(data,index,dtype,copy)
其中,data用于保存输入的数据,可以是各种类型的数据;index表示数据的索引值,该索引值是唯一的,与数据长度相同;dtype表示数据类型,如果没有输入,则自行判断数据的类型;copy表示是否复制数据,默认值为False。
【实例1-17】 使用Pandas模块创建一个包含5个元素的Series对象和一个包含1个元素的Series对象。打印这两个Series对象,代码如下:
#===第1章代码1-17.py===# import pandas as pd data1=['a','b','c','d','e'] data2='ABCDE' series1=pd.Series(data1) series2=pd.Series(data2) print(series1) print(series2)
运行结果如图1—34所示。
图1—34 代码1-17.py的运行结果
在Pandas模块中,可以使用函数pandas.DataFrame()创建DataFrame对象,其语法格式如下:
import pandas as pd df1=pd.DataFrame(data,index,columns,dtype,copy)
其中,data用于保存输入的数据,可以是各种类型的数据;index表示行标签,如果没有传递index值,则默认的行标签是np.arange(n),n代表data的元素个数;columns表示列标签,如果没有传递columns值,则默认的行标签是np.arange(n);dtype表示每列的数据类型,如果没有输入,则自行判断数据的类型;copy表示是否复制数据,默认值为False。
【实例1-18】 使用Pandas模块创建一个包含1列元素的DataFrame对象和一个包含2行3列元素的DataFrame对象。打印这两个DataFrame对象,代码如下:
#===第1章代码1-18.py===# import pandas as pd data1=['a','b','c','d','e'] data2=[['c','java','python'],['11','12','13']] df1=pd.DataFrame(data1) df2=pd.DataFrame(data2) print(df1) print(df2)
运行结果如图1—35所示。
图1—35 代码1-18.py的运行结果
在Pandas模块中,可以使用函数pandas.Panel()创建Panel对象,其语法格式如下:
import pandas as pd pan1=pd.Panel(data,items,major_axis,minor_axis,dtype,copy)
其中,data用于保存输入的数据,可以是各种类型的数据;items表示axis=0;major_axis表示axis=1;minor_axis表示axis=2;dtype表示每列的数据类型;copy表示是否复制数据,默认值为False。
注意: 最新版本的Pandas模块已经移出了Panel类。如果有读者要使用Panel类,则可以安装之前的版本。
第三方模块Pandas是一个很强大的模块,不仅可以读取Excel工作簿中的数据,还可以读取HTML、JSON、CSV格式文件中的数据,使用的函数见表1—10。
表1—10 Pandas模块中读取文件的函数
由于Excel文件是比较复杂的文件,因此pandas.read_excel()函数的参数非常多,该函数详细的语法格式如下:
import pandas as pd data=pd.read_excel(io,sheet_name=0,header=0,names=None,index_col=None, usecols=None,squeeze=False,dtype=None,engine=None, converters=None,true_values=None,false_values=None, skiprows=None,nrows=None,na_values=None,parse_dates=False, date_parser=None,thousands=None,comment=None,skipfooter=0, convert_float=True,encoding=None,**kwds)
其中,常用参数的说明见表1—11。
表1—11 pandas.read_excel()函数中的常用参数说明
【实例1-19】 在D盘test文件夹下有一个Excel文档(销售数据.xlsx)。该文档的工作表Sheet1如图1—36所示。
图1—36 销售数据.xlsx
使用Pandas模块读取该工作表中的数据,然后跳过第1行读取工作表中的数据,打印读取的数据,代码如下:
#===第1章代码1-19.py===# import pandas as pd src_path='D:\\test\\销售数据.xlsx' data1=pd.read_excel(src_path,sheet_name='Sheet1') print(data1) data2=pd.read_excel(src_path,sheet_name='Sheet1',skiprows=[1]) print(data2)
运行结果如图1—37所示。
图1—37 代码1-19.py的运行结果
在Pandas模块中,可以创建Excel工作簿,并将数据写入Excel工作簿。首先创建一个带有目标文件名的ExcelWriter对象,然后使用DataFrame对象的to_excel()方法,将DataFrame中的数据写入Excel文档,其语法格式如下:
import pandas as pd dataf=pd.DataFrame(data)#创建包含数据data的DataFrame对象 writer=pd.ExcelWriter(path)#创建带有目标文件名的ExcelWriter对象 dataf.to_excel(writer,sheet_name=None)#将数据写入Excel文档 writer.save()#保存数据 writer.close()
其中,path表示目标文件名的路径;sheet_name表示Excel工作表的名称。
如果Excel工作簿已经被创建,则可以直接使用DataFrame对象的to_excel()方法将数据写入Excel文档,其语法格式如下:
import pandas as pd dataf.to_excel(path,index=False)#将数据写入已存在的Excel文档
其中,path表示已存在的Excel文档的路径。
在Pandas模块中,函数DataFrame.to_excel()的语法格式如下:
DataFrame.to_excel(excel_writer,sheet_name='Sheet1',na_rep='',float_format=None, columns=None,header=True,index=True,index_label=None,startrow=0,startcol=0, engine=None,merge_cells=True,encoding=None,inf_rep='inf',verbose=True,freeze_panes= None)
其中,常用参数的说明见表1—12所示。
表1—12 DataFrame.to_excel()函数中常用参数的说明
【实例1-20】 使用Pandas模块在D盘test文件夹下创建一个Excel文档(文学名著.xlsx),然后创建一组包含文学名著名字和人物的DataFrame数据,最后写入Excel文档,代码如下:
#===第1章代码1-20.py===# import pandas as pd src_path='D:\\test\\文学名著.xlsx' info=pd.DataFrame({ '西游记':['唐僧','孙悟空','猪八戒','沙僧','白龙马'], '红楼梦':['贾宝玉','林黛玉','薛宝钗','史湘云','晴雯'], '三国演义':['曹操','孙权','刘备','诸葛亮','司马懿'] }) writer=pd.ExcelWriter(src_path) info.to_excel(writer,sheet_name='Sheet1') writer.save() writer.close()
运行结果如图1—38所示。
图1—38 代码1-20.py创建的Excel工作表
注意: 当使用Pandas模块打开已存在的Excel文件并写入数据时,一定要慎重。因为在保存数据那一刻,会清除Excel文件中原有的数据,因此,Pandas模块经常和xlwings、openpyxl模块一起使用,处理比较复杂的问题。
Pandas模块、xlwings模块搭配使用,可以处理比较复杂的信息,例如将Excel工作表中的列数据分拆成多列数据。
【实例1-21】 在D盘test文件夹下有一个Excel文档(电冰柜.xlsx),该文档的工作表Sheet1如图1—39所示。
图1—39 电冰柜.xlsx文件中工作表Sheet1
将工作表中的产品尺寸列分拆为长、宽、高三列,并保存该文档,代码如下:
#===第1章代码1-21.py===# import xlwings as xw import pandas as pd app=xw.App(visible=False,add_book=False) book=app.books.open('D:\\test\\电冰柜.xlsx') sheet=book.sheets['Sheet1'] #读取工作表中的数据并转换为Pandas模块的DataFrame格式 data=sheet.range('a1').options(pd.DataFrame,header=1,index=False,expand='table').value print(data) #分拆DataFrame数据中的['产品尺寸(mm)']列 new_data=data['产品尺寸(mm)'].str.split('*',expand=True) print(new_data) new_data.columns=['长(mm)','宽(mm)','高(mm)'] #在E列中插入两列 for n in range(new_data.shape[1]-1): sheet['E:E'].insert(shift='right',copy_origin='format_from_left_or_above') #在E列中写入数据 sheet['E1'].options(index=False).value=new_data sheet.autofit() book.save() app.quit
运行结果如图1—40和图1—41所示。
图1—40 代码1-21.py的运行结果
图1—41 代码1-21.py分拆的列数据
Pandas模块、xlwings模块搭配使用,可以处理比较复杂的信息,例如对Excel工作表中的数据按照特定规则进行分类,这主要使用了DataFrame对象的groupby(name)方法,参数name表示分组所依据的列,也可以用列表的形式指定多列。
【实例1-22】 在D盘text文件夹下的demo2文件夹中有一个Excel文档(1月-4月销售数据.xlsx),该文档的工作表(1月)如图1—42所示。
图1—42 1月-4月销售数据.xlsx文件中的工作表
将工作表中的所有数据按照产品名称进行分类,并写入不同的工作表,代码如下:
#===第1章代码1-22.py===# import xlwings as xw import pandas as pd app=xw.App(visible=False,add_book=False) book=app.books.open('D:\\test\\demo2\\1月-4月销售数据.xlsx') sheet_list=book.sheets table=pd.DataFrame() cols=['单号','销售日期','产品名称','成本价(元/台)','售价(元/台)','销售数量(台)'] for index,val in enumerate(sheet_list): data=val.range('a1').options(pd.DataFrame,header=1,index=False,expand='table').value data=data.reindex(columns=cols)#设置列标题 table=pd.concat([table,data],ignore_index=True) #table=table.append(data,ignore_index=True) #按产品名称对数据进行汇总 table=table.groupby('产品名称') print(table) new_book=xw.books.add() for index,group in table: new_sheet=new_book.sheets.add(index) new_sheet['a1'].options(index=False).value=group new_sheet.autofit() new_book.save('D:\\test\\demo2\\1月-4月分类统计数据.xlsx') app.quit()
运行结果如图1—43和图1—44所示。
图1—43 代码1-22.py的运行结果
图1—44 1月-4月分类统计数据.xlsx文件中的工作表
注意: 使用DataFrame对象的方法append()可以拼接数据,也可以使用函数pandas.contact()拼接数据,前一种方法会在Pandas未来的版本中舍弃。