pandas学习之 - excel篇

一、读取Excel文件

  read_excel()   # 读取excel文件(需要安装xlrd和openpyxl两个模块)

  1、方法使用了Python的 xlrd 模块来读取Excel2003(.xls)版本的文件,而Excel2007(.xlsx)及以上版本的使用了xlrd 或者 openpyxl 模块来读取的。

  2、在大多数基本的使用案例中,read_excel会读取Excel文件通过一个路径,并且sheet_name会表明需要解析哪一张表格。语法:pd.read_excel("文件路径名.xlsx", sheet_name="表格名称")

  3、为了更方便地读取同一个文件的多张表格,ExcelFile类可用来打包文件并传递给read_excel。因为仅需读取一次内存,所以这种方式读取一个文件的多张表格会有性能上的优势。语法如下

xlsx = pd.ExcelFile("unit.xlsx")
xlsx.sheet_names  # 以列表形式返回工作薄中所有工作表的表名 df
= pd.read_excel(xlsx, "sheet1")  # 指定获取unit.xlsx工作薄中的sheet1工作表

  4、ExcelFile类也能用来作为上下文件管理器。

with pd.ExcelFile("./unit.xlsx") as xlsx:
    df1 = pd.read_excel(xlsx, "Sheet1")
    df2 = pd.reda_excel(xlsx, "Sheet2")

  5、ExcelFile一个主要的用法就是用来解析多张表格的不同参数:

data = {}
# 当Sheet1的格式不同于Sheet2的格式时
with pd.ExcelFile('path_to_file.xls') as xls:
    data['Sheet1'] = pd.read_excel(xls, 'Sheet1', index_col=None, na_values=['NA'])
    data['Sheet2'] = pd.read_excel(xls, 'Sheet2', index_col=1)

  6、注意如果所有的表格解析同一个参数,那么这组表格名的列表能轻易地传递给read_excel且不会有性能上地损失。

# 使用ExcelFile类
data = {}
with pd.ExcelFile('./unit_data.xls') as xls:
    data['公安局'] = pd.read_excel(xls, '公安局', index_col=None,
                                   na_values=['NA'])
    data['就业局'] = pd.read_excel(xls, '就业局', index_col=None,
                                   na_values=['NA'])

# 等价于read_excel函数
data = pd.read_excel('unit_data.xls', ['公安局', '就业局'],
                     index_col=None, na_values=['NA'])

  7、指定表格

     注意:在read_excel第二个参数是 sheet_name, 不要同 ExcelFile.sheet_names 搞混淆了

       ExcelFile的属性 sheet_names 提供的是多张表格所生成的列表。

  • sheet_name 参数允许指定单张表格或多张表格被读取。
  •  sheet_name 的默认值是0,这表明读取的是第一张表格
  •  在工作薄里面,使用字符串指向特定的表格名称。
  •  使用整数指向表格的索引,索引遵守Python的约定从0开始的。
  •  无论是使用一组字符串还是整数的列表,返回的都是指定表格的字典。
  •  使用 None 值则会返回所有可用表格的一组字典。
# 返回一个DataFrame
pd.read_excel('path_to_file.xls', 'Sheet1', index_col=None, na_values=['NA'])

  使用表格索引:

# 返回一个DataFrame
pd.read_excel("path_to_file.xls", 0, index_col_None, na_values=["NA"])

  使用所有默认值:

# 返回一个DataFrame,默认sheet_name=0
pd.read_excel('path_to_file.xls')

  使用None获取所有表格:

# 返回DataFrames的字典
pd.read_excel('path_to_file.xls', sheet_name=None)

  使用列表获取多张表格:

# 返回第一张和第四张纸,作为DataFrames的字典。
pd.read_excel('path_to_file.xls', sheet_name=['Sheet1', 3])

  read_excel能读取不止一张表格,通过sheet_name能设置为读取表格名称的列表,表格位置的列表,还能设置为None来读取所有表格。多张表格能通过表格索引或表格名称分别使用整数或字符串来指定读取。


MultiIndex读取

  read_excel能用MultiIndex读取多个索引,通过index_col方法来传递列的列表和header将行的列表传递给MultiIndex的列。无论是index还是columns,如果已经具有序列化的层级名称,则可以通过指定组成层级的行/列来读取它们。

# 例如,用MultiIndex读取没有名称的索引:
df = pd.DataFrame({"a":[1,2,3,4], "b":[5,6,7,8]},
                 index=pd.MultiIndex.from_product([["a","b"],["c","d"]]))

df.to_excel("abc.xlsx",sheet_name="temp.xlsx")

df = pd.read_excel("abc.xlsx",index_col=[0,1])

df
# out:
     a  b
a c  1  5
  d  2  6
b c  3  7
  d  4  8
 

解析特定的列

  常常会有这样的情况,当用户想要插入几列数据到Excel表格里面作为临时计算,但是你又不想要读取这些列的时候,read_excel提供的usecols方法就派上用场了,它让你可以解析指定的列。

  语法:pd.read_excel("路径", sheet_name="表名", usecols=[0,2,3])  # 表示只显示0,2,3列,注意点是顺序是被忽略的,usecols=[0,1] 等价于 [1,0]


解析日期

  当读取excel文件的时候,像日期时间的值通常会自动转换为恰当的dtype(数据类型)。但是如果你有一列字符串看起来很像日期(实际上并不是excel里面的日期格式),那么你就能使用parse_dates方法来解析这些字符串为日期:

  例:pd.read_excel('path_to_file.xls', 'Sheet1', parse_dates=['列索引'])


单元格转换

  Excel里面的单元格内容是可以通过converters方法来进行转换的。例如,把一列转换为布尔值:

  例: pd.read_excel('path_to_file.xls', 'Sheet1', converters={'列索引': bool, "身份证列":str})

  这个方法可以处理缺失值并且能对缺失的数据进行如期的转换。由于转换是在单元格之间发生而不是整列,因此不能保证dtype为数组。例如一列含有缺失值的整数是不能转换为具有整数dtype的数组,因为NaN严格的被认为是浮点数。你能够手动地标记缺失数据为恢复整数dtype:

  

def cfun(x):
    return int(x) if x else -1


pd.read_excel('path_to_file.xls', 'Sheet1', converters={'列字段名': cfun})

  数据类型规范

  作为另一个种转换器,使用dtype能指定整列地类型,它能让字典映射列名为数据类型。使用strobject来转译不能判断类型的数据:

  

pd.read_excel('path_to_file.xls', dtype={'列字段名1': 'int64', '列字段名2': str})

二、to_excel()   # 写入excel文件到指定磁盘中

  df.to_excel("path_to_file.xlsx", sheet_name="sheet1")  # 第一个参数是excel文件的名字,第二个是表的名字。

  DataFrame将尝试以模拟REPL(“读取-求值-输出" 循环的简写)输出的方式写入。index_label将代替第一行放置到第二行,你也能放置它到第一行通过在to_excel()里设置merge_cells选项为False:

  

df.to_excel('path_to_file.xlsx', index_label='label', merge_cells=False)

  为了把DataFrames数据分开写入Excel文件的不同表格中,可以使用ExcelWriter方法。

with pd.ExcelWriter('path_to_file.xlsx') as writer:
    df1.to_excel(writer, sheet_name='Sheet1')
    df2.to_excel(writer, sheet_name='Sheet2')

  注意:为了从read_excel内部获取更多点的性能,Excel存储所有数值型数据为浮点数。但这会产生意外的情况当读取数据的时候,如果没有损失信息的话(1.0 --> 1),pandas默认的转换整数为浮点数。你可以通过convert_float=False禁止这种行为,这可能会在性能上有轻微的优化。 


 

  写入Excel文件到内存

  Pandas支持写入Excel文件到类缓存区对象如StringIOBytesIO,使用ExcelWriter方法。

#安全导入到Python 2.x或3.x
try:
    from io import BytesIO
except ImportError:
    from cStringIO import StringIO as BytesIO

bio = BytesIO()
#通过在ExcelWriter构造函数中设置“引擎”。
writer = pd.ExcelWriter(bio, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')

# 保存工作簿
writer.save()

# 从头开始查找并读取以将工作簿复制到内存中的变量
bio.seek(0)
workbook = bio.read()

Excel写入引擎 

Pandas选择Excel写入有两种方式:

  1. 使用engine参数
  2. 文件名的扩展(通过默认的配置方式指定)  

  为了指定你想要使用的写入方式,你可以设置引擎的主要参数为to_excelExcelWriter。内置引擎是:  

  • openpyxl: 要求2.4或者更高的版本。
  • xlsxwriter
  • xlwt
# 通过在DataFrame的“ to_excel()”方法中设置“引擎”。
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', engine='xlsxwriter')

#通过在ExcelWriter构造函数中设置“引擎”。
writer = pd.ExcelWriter('path_to_file.xlsx', engine='xlsxwriter')

# 或通过pandas配置。
from pandas import options                                     # noqa: E402
options.io.excel.xlsx.writer = 'xlsxwriter'

df.to_excel('path_to_file.xlsx', sheet_name='Sheet1')

样式

通过pandas产生的Excel工作表的样式可以使用DataFrameto_excel方法的以下参数进行修改。

  • float_format:格式化字符串用于浮点数(默认是None)。
  • freeze_panes:两个整数的元组,表示要固化的最底行和最右列。这些参数中的每个都是以1为底,因此(1, 1)将固化第一行和第一列(默认是None)。

使用 XlsxWriter引擎提供的多种方法来修改用to_excel方法创建的Excel工作表的样式。你能在 XlsxWriter文档里面找到绝佳的例子:https://xlsxwriter.readthedocs.io/working_with_pandas.html


pd.merge(left, right, on=[], how="inner") # 可以指定按照两组数据的共同键值对合并或者左右各自

    参数left:表示左数集

    参数right:表示右数集

    参数on:表示要加入的列(名称)。 必须在左右DataFrame对象中都找到。

    参数left_on,right_on:当两个表里没有完全一致的列名,但是有信息一致的列,需要比对时只需要传入两列的列名即可比对。

    参数how:表示集合方式,以何种方式连接,有四个参数可选,left表示左交集,right表示右交集,inner表示共有数据,outer表示左右交集有没有都全部显示。

posted @ 2020-10-07 16:50  霍非  阅读(824)  评论(0编辑  收藏  举报