zoukankan      html  css  js  c++  java
  • excel及数据处理

    一、xlrd

    二、xlwt

    三、openyxl

    四、numpy

    五、pandas

    openpyxl

    1. 简介

    openpyxl模块是一个读写Excel2010文档的Python库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl能够同时读取和修改Excel文档

    2.  安装和引用

    pip install openpyxl

    from openpyxl import load_workbook, Workbook

    3. Workbook对象

    3.1 创建Workbook对象

    excel = openpyxl.Workbook()      会创建新的excel时会默认创建一个sheet

    excel = openpyxl.load_workbook("hello.xlsx")    导入已经存在的excel

    3.2 Workbook对象的方法

    方法 解释 例子 结果
    get_sheet_names 获取所有表格的名称,新版已不适用    
    get_sheet_by_name 通过表格名称获取worksheet对象,新版已不适用    
    get_active_sheet 获取活跃的表格,新版已不适用    
      通过表格名称获取worksheet对象 excel['sheetname'] <Worksheet "def">
    remove_sheet('sheet') 删除一个表格 excel.remove_sheet(excel["mysheet"])  参数为sheet对象
    create_sheet(title,index) 创建一个空的表格,index=0插入到开头 excel.create_sheet('ghk',0) index表示插入表格的位置
    copy_worksheet('sheet') 在workook内拷贝表格  excel.copy_worksheet(excel["mysheet"])  只能在一个excel里复制,不能跨excel复制
    active 获取当前活跃的Worksheet excel.active 没有则返回None,有则返回Worksheet对象-<Worksheet "abc">
    worksheets 以列表形式返回所有worksheet excel.worksheets

    [<Worksheet "abc">, <Worksheet "def">]

    read_only 判断是否以只读形式打开 excel.read_only False
    encoding 获取文档的字符集编码 excel.encoding  'utf-8'
    properties 获取文档的源数据,标题作者等 excel.properties

     

    sheetnames 获取工作簿中的表(列表) excel.sheetnames  ['abc','def']

     

     

    4.Worksheet对象 

    4.1获取Worksheet对象

    sheet = excel.get_sheet_by_name("Sheet1") ---【注:包的新版本已不再适用】        或

    sheet = excel["Sheet1"]        或

    sheet = excel.worksheets[0]

    4.2worksheet的方法

    方法 解释 例子  结果
    title 表格的标题  sheet.title="new title"  
    max_row 表格的最大行数    
    max_column 表格的最大列数    
    min_row 表格的最小行    
    min_column 表格的最小列    
    rows 按行获取单元格(Cell对象)-生成器    
    columns 按列获取单元格(Cell对象)-生成器    
    dimensions 表格的大小,即左上角和右下角的坐标    
    freeze_panes 冻结窗格,主要用于冻结顶部的行或左边的列,用户滚动表格时始终可见    
    values 按行获取表格的数据内容-生成器    
    iter_rows(min_row=1,max_row=4,min_col=2,max_col=4) 按行获取所有单元格   返回的是一个Cell对象,Cell对象不等于cell的值
    iter_columns 按列获取所有单元格    
    append 在表格末尾添加数据    
    merged_cells 合并多个单元格    
    unmerged_cells 移除合并的单元格    
      获取cell对象 excel['sheetname']['A1'] 返回一个Cell对象<Cell 'sheetname'.A1>
        excel['sheetname'].cell(row=1,column=2) 返回一个Cell对象<Cell 'sheetname'.B1>
    sheet_properties.tabColor 给sheet的标题一个背景颜色 sheet.sheet_properties.tabColor='e7e7e7'  

     

     

     

     

     

     

    5.Cell对象

    5.1 获取单个cell对象

    sheet['A1']     或

    sheet.cell(row=1,column=2)

    5.2 获取多个cell对象

    cell_range = sheet['A1':'C2']    返回一个元祖,元祖内容是两行三列Cell对象,而非cell的value

    col_content = sheet['C']     返回C列的内容,也是元祖形式Cell对象

    col_content = sheet['A:C']   返回A列到C列(包含C列)的Cell对象,元祖形式,一列一列取值

    row_content = sheet[10]     返回第10行数据

    row_content = sheet[10:12]    返回第10行到第12行数据

    sheet.iter_rows(min_row=1,max_row=4,min_col=2,max_col=4)             按行取,行数和列数都包含在内

    sheet.iter_columns(min_row=1,max_row=4,min_col=2,max_col=4)       按列取

    如果想迭代所有行和列

    sheet.rows()     按行取

    sheet.columns()     按列取

    备注:多个cell对象的获取返回的都是元祖形式,根据按行取或按列取,返回元祖里的内容不太一样

    5.3 cell对象的方法

    方法 解释 例子 结果
    row 单元格所在的行 excel['sheet1'].cell(row=1,column=2).row 返回行号1
    column 单元格所在的列 excel['sheet1'].cell(row=1,column=2).column 返回列号B
    value 单元格的值 excel['sheet1'].cell(row=1,column=2).value 返回单元格里的值
    coordinate 单元格的坐标 excel['sheet1'].cell(row=1,column=2).coordinate 返回坐标B1

     

     5.4 cell赋值

    sheet[“A3”] = "ABC"  或   sheet["A3"].value = "ABC"

    sheet.cell(row=1,column=2).value = "ABC"

     6.保存更改

    excel.save("test.xlsx")

    -----------------------------------------------------------------------------------------------------------

     numpy

    1.简介

    numpy提供了ndarray和matrix两种类型的数据

    2.安装及引用

    pip install numpy

    import numpy as np

    3.数组的使用

    3.1创建数组

    a=np.array([1,2,3,4,5,6])

    print a   -->  [1,2,3,4,5,6]

    3.2 数组变形

    b=a.shap(2,3)  #把a变为两行三列

    print b  --->  [[1,2,3],[4,5,6]]

    c=b.ravel()   #拉直数组

    print c --->   arry([1,2,3,4,5,6])

    -------------------------------------------------------------------------------------------------------------

    pandas

    Pandas是python的一个数据分析包,建立在numpy库之上

    安装:pip install pands

    导入:import pandas as pd、from pandas import Series,DataFrame

    Series:一维数组,Series 就如同列表一样,一系列数据,每个数据对应一个索引值。比如这样一个列表:[9, 3, 8],如果跟索引值写到一起,就是:

    index data
    0 9
    1 3
    2 2

    创建对象:s=Series([100,"python","soochow"])

    print s的时候会把里面的值和索引都打印出来,索引是从0开始的整数

    输入 s.values   值

    输出 array([100,'python','soochow'], dtype=object)

    输入 s.index    索引

    输出 Int64Index([0,1,2], dtype=int64)

    series可以自定义索引

    s2=Series([100,'python','soochow'], index=['mark','title','name'])

    输入 s2.index

    输出 Index(['mark','title','name'],dtype=object)

    可以根据索引,修改元素的值,例如s2["name"]="qq"

    另外一种定义方法:

    sd={"python": 8000,"c++":8100,"c#":4000}    前面的数是索引,后面的是值

    s4=Series(sd)

    c# 4000
    c++ 8100
    python 8000

    s4里面的数据内容可以根据索引的不同位置而改变,根据索引而自动对齐排列,如果索引不存在自动赋值NaN,索引的名字也是可以重新定义的,例如

    s6=Series(sd, index=["java","python","c++","c#"])

    java NaN
    python 8000
    c++ 8100
    c# 4000

    pd.isnull(s6)/pd.notnull(s6)用来判断值是否为空,值为True/False则索引对应的值是空

    java True
    python False
    c++ False
    c# False

    备注:或用对象方法s6.isnull()

    如果series里面的数据都是数字的话,是可以计算的,比如s3[s3>5]取s3里的值大于5的项,s3*5得到的是s3里的值都乘以5

    DataFrame:二维的表格型数据结构,类似数据库中的table,竖行称之为columns,横行为index

    import pandas as pd
    from pandas import Series, DataFrame
    data = {"name":["yahoo","google","facebook"], "marks":[200,400,800], "price":[9, 3, 7]}
    f1 = DataFrame(data)
    f1的值:
        marks  name      price 
    0    200    yahoo     9 
    1    400    google    3 
    2    800    facebook  7 

    字典中的键就是DataFrame的columns的值,columns的顺序没有规定,就如同字典中键的顺序一样,但是他的顺序是可以被规定的。

    columns的数量还可以比data的columns的数量多,会被自动赋值NaN

    f2 = DataFrame(data, columns=['name','price','marks'])
    f2的值:
           name     price  marks 
    0     yahoo     9      200 
    1    google     3      400 
    2  facebook     7      800 

    DataFrame还可以定义index的值,index的数量不能超过data的行数,否则会报错:

    f3 = DataFrame(data, columns=['name', 'price', 'marks', 'debt'], index=['a','b','c'])
    f3的值:
           name      price  marks  debt 
    a     yahoo      9      200     NaN 
    b    google      3      400     NaN 
    c  facebook      7      800     NaN

    另外一种定义方式:第一层键是数列名称,第二层字典键是每横行索引,第二层字典值是对应的数据

    newdata = {"lang":{"firstline":"python","secondline":"java"}, "price":{"firstline":8000}}
    f4 = DataFrame(newdata)
    f4的值:
                  lang     price 
    firstline     python   8000 
    secondline    java     NaN 
    DataFrame(newdata, index=["firstline","secondline","thirdline"])   #额外添加了索引,默认为NaN
                  lang     price 
    firstline     python   8000 
    secondline    java     NaN 
    thirdline     NaN      NaN 

    取值,取出来的是Series,所以说DataFrame是由一个一个的series组成的:

    f3['name']
    a       yahoo 
    b      google 
    c    facebook 
    Name: name
    f3['debt'] =  Series([2.2, 3.3], index=["a","c"]) 得到
           name  price  marks  debt 
    a     yahoo  9        200   2.2 
    b    google  3        400   NaN 
    c  facebook  7        800   3.3
     

    赋值:

    f3['debt'] = 89.2
    f3的值:
          name     price  marks  debt 
    a     yahoo     9        200  89.2 
    b    google     3        400  89.2 
    c  facebook     7        800  89.2
    f3["price"]["c"]= 300 
           name   price   marks  debt 
    a     yahoo   9       200    2.2 
    b    google   3       400    NaN 
    c  facebook   300     800    3.3 


    Panel:三维的数组

    读取excel(需要安装openpyxl pip install openpyxl)

    xls=pd.ExcelFile("./marks.xlsx")

    获取sheet表

    sheet1=xls.parse("Sheet1")

  • 相关阅读:
    SpringMVC+Apache Shiro+JPA(hibernate)
    Win7系统上配置使用Intellij Idea 13的SVN插件
    标志一个方法为过时方法
    Java模板引擎 HTTL
    Spring security与shiro
    墨刀 手机app原型工具
    java远程调试(断点)程序/tomcat( eclipse远程调试Tomcat方法)
    结合MongoDB开发LBS应用
    基于LBS的地理位置附近的搜索以及由近及远的排序
    discuz 发布分类信息,能不能设置单版块去掉“发帖子”(默认点发帖后为自定义的默认分类信息模版)
  • 原文地址:https://www.cnblogs.com/zz27zz/p/9401929.html
Copyright © 2011-2022 走看看