购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.4 Pandas模块

在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模块

1.4.1 Pandas模块创建的对象

Pandas是一个开源的第三方Python库,从NumPy和Matplotlib的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。Pandas已经成为Python数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具。

Pandas模块是采用面向对象的思想编写而成的。可以创建3种对象(Series、DataFrame、Panel)。这3种对象分别用于处理不同类型的数据结构,具体的数据结构见表1—9。

表1—9 Pandas模块创建的对象

1.创建Series对象

在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的运行结果

2.创建DataFrame对象

在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的运行结果

3.创建Panel对象

在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类,则可以安装之前的版本。

1.4.2 读取Excel工作簿

第三方模块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的运行结果

1.4.3 创建并写入Excel工作簿

在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模块一起使用,处理比较复杂的问题。

1.4.4 拆分列数据

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分拆的列数据

1.4.5 批量分类数据

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未来的版本中舍弃。 G1Tfdh5SK0Nlf4XCh8vq4orgY7t8kMuQDLZEGgPf+e+bdZqEW4Tlnk6LwxVMnsE6

点击中间区域
呼出菜单
上一章
目录
下一章
×