读取 excel 表格
pandas.read_excel()函数
read_excel()函数用于读取Excel文件并将其转换为Pandas的DataFrame对象。这是处理Excel数据的基础。函数原型如下:
pandas.read_excel(io, sheet_name=0, *, header=0, names=None, index_col=None, usecols=None, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, parse_dates=False, date_parser=<no_default>, date_format=None, thousands=None, decimal='.', comment=None, skipfooter=0, storage_options=None, dtype_backend=<no_default>, engine_kwargs=None)
- io:为文件类对象,一般作为读取文件的路径,支持类型:str、bytes、ExcelFile、xlrd.Book、path object、file-like object
- sheet_name=0:指定excel某张表。sheet_name可以是str、int、list 或 None类型。默认值0表示默认读取第一张表。
- 【例】sheet_name="A" # 读取A表,返回的是DataFrame
- 【例】sheet_name=None # 读取所有的表,返回的是字典。key为表名,value为DataFrame
- 【例】sheet_name=[0, "A", "B"] # 读取第一张表和A表B表,返回的是字典。
- header=0:指定某一行作为表头,默认值表示指定第一行为标题行
- 【例】header=[] # 主要针对复合表头的情况
- 【例】header=None #设置为从0递增的数作为表头,适合原Excel表没有列名的情况,文件里有列名的情况下,列名也被当成了数据
- names=None:此参数接收一个数组,将列名重定义赋值,默认值None表示不做操作,设置列名,必须是list类型,且长度和列数一致
- 【例】names=["L1", "L2", "L3", "L4", "L5", "L6"]
- index_col=None:指定哪一列做索引,默认值是None表示重新设置一列成为index值
- 【例】index_col=0 # 指定第1列作为索引列
- usecols=None:选择读取一张表中的指定列,默认值None表示选择表中的所有列。
- 【例】usecols=[0, 2] # 读取第一列和第三列
- 【例】usecols="A, C, E:F" # 取 A和C列,再加E到F列
- 【例】usecols='A, B' # 取 A 和 B 两列
- 【例】usecols='B:D' # 取 B 到 D 列
- 【例】usecols=['name', 'province'] # 取指定列名的列
- 【例】usecols=lambda x: 'p' in x # 表头包含 p 的
- dtype=None:设置列的类型,指定读取列的数据类型,可接收字典,若指定了"converters"参数,则dtype函数失效。
- 【例】dtype={"phone_number": np.float64, "value": np.float64})
- engine=None:该参数为指定Excel处理引擎,一般Excel处理引擎为xlrd、openpyxl、odf
- 【例】engine='xlrd' # 支持旧式的Excel文件,如xls文件。pandas1.2.0发生变化,xlrd引擎现在只支持解析xls文件。
- 【例】engine='openpyxl' # 支持较新的Excel文件格式。
- 【例】engine='odf' # 支持OpenDocument文件格式如odf,ods,odt。
- 【例】engine='pyxlsb' # 支持二进制Excel文件。
- converters=None:按指定函数解析,指定列数据类型转换函数,包括了dtype的功能,也可以对某一列使用Lambda函数,进行某种运算,和usecols参数连用
- 【例】converters={"name": lambda x: "沪" + x, "age": lambda x: x+1})
- 【例】converters={0: lambda x: x+5, 1: lambda x: x + "市"}) # 0代表usecols=[1, 3]中的索引号
- true_values=None:传输一个列表判断为true或是false
- false_values=None:传输一个列表判断为true或是false
- skiprows=None:跳过某一行,默认值None标识不操作
- 【例】skiprows=4 # 跳过前 4 行,会把首行列名也跳过
- 【例】skiprows=[0, 9] # 跳过第一行和第十行
- 【例】skiprows=lambda x:x%2==0 # 仅取偶数行
- 【例】skiprows=range(1, 10) # 跳过 [1,10) 行,不包括第10行,可以留下首行列名
- nrows=None:int类型,默认None。指定要读取的行数数量上限,通常用于较大的数据文件中。
- 【例】nrows=10
- na_values=None:将指定的值或者传入中的列表中的值设置为NaN,这个参数不受 keep_default_na 值的影响
- 【例】na_values="山西省" # 表示将所有数据中 山西省 全部替换为NaN
- 【例】na_values=["山西省", "江西省"] # 表示将所有数据中 山西省、江西省 全部替换为NaN
- 【例】na_values={"province": ["山西省", "江西省"]} # 表示将province列中所有的 山西省、江西省 全部替换为NaN
- keep_default_na=True:是否将缺失值转换成NaN值,依赖na_values参数是否被传递,默认为True,即自动识别空值导入。注意,如果na_filter传入为False,则keep_default_na和na_values参数将被忽略。
- 【例】keep_default_na=True # 默认为True,将缺失值转换成 NaN 值,如果keep_default_na为True,并且未指定na_values,则只将默认的NaN值解析为空值。
- 【例】keep_default_na=False # 缺失值将保留原始值,若keep_default_na为False,并且指定na_values,则只将na_values指定的值解析为空值。未指定na_values,则不会将任何字符串解析为空值。
- na_filter=True:检测缺少的值标记。当数据中没有任何空值时,na_filter设置为False可以提高处理速度,特别是处理大文件时。
- 【例】na_filter=True # 默认检测,如果判定为缺失值,那么值将被修改为 NaN
- 【例】na_filter=False # 表示不检测,在没有空值的情况下能提升性能,如果 na_filter 的值为False,那么参数 keep_default_na 和 na_values 参数将会失效
- verbose=False:是否打印非数值列中缺失值的数量,默认不打印
- parse_dates=False:解析成 datetime64 类型,支持类型:bool、list、dict,默认不操作
- 【例】parse_dates=True # 把索引列解析成 datetime64 类型
- 【例】parse_dates=[1,2] or ['a', 'b'] # 分别解析第 1,2 列为 datetime64
- 【例】parse_dates=[[1,2]] # 合并第 1,2 列,然后解析为 datetime64
- 【例】parse_dates={'date': [1,2]} # 合并第 1,2 列,然后解析为 datetime64 并取列名 'date'
- date_parser=<no_default>,设置处理日期数据的函数,利用lambda函数,将某个字符串列,解析为日期格式,具体解析哪些列取决于parse_dates指定的参数
- 【例】date_parser=lambda x: pd.datetime.strptime(x, '%Y年%m月%d号')
- 【例】date_parser=lambda x: pd.to_datetime(x, format="%Y年%m月%d号")
- date_format=None:如果与parse_dates结合使用,将根据此格式解析日期。对于更复杂的情况,请以对象的形式读入,然后根据需要应用to_datetime()。
- thousands=None
- decimal='.':识别为小数点的字符。注意,此参数仅对Excel中存储为TEXT的列必须,其他任何数值列都会自动解析,无论显示格式如何。
- comment=None:指定注释符,其后面的内容将不会被读取,指定一个字符串为注释符,比如 '#', 那么在带 '#' 的行中,'#' 及后面的数据全部不会被读取
- skipfooter=0:int类型,默认0。自下而上,从尾部指定跳过行数的数据
- 【例】skipfooter=5 # 从尾部少读5行
- storage_options=None:对特定存储连接(例如主机、端口、用户名、密码等)有意义的额外选项。
- dtype_backend=<no_default>
- engine_kwargs=None
写入 excel 表格
有时候我们需要把DataFrame输出到excel表格进行存储,可以使用下面这些方式操作。
(1)使用pandas的to_excel方法
这是最直接的方法,可以直接使用to_excel
函数将DataFrame保存为Excel文件:
# 创建一个示例 DataFrame
data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
df = pd.DataFrame(data)
# 将DataFrame存入Excel文件
df.to_excel(excel_writer='output.xlsx', sheet_name='Sheet1', index=False)
(2)使用pandas的ExcelWriter和to_excel
class ExcelWriter(path, engine=None, date_format=None, datetime_format=None, mode="w", storage_options=None, if_sheet_exists=None, engine_kwargs=None)
描述:将 DataFrame 对象写入 Excel 表格的类。
参数说明:
- path:指定要写入的 Excel 文件的路径。
- engine:指定用于写入 Excel 文件的引擎。注意只能作为关键字参数传递。默认为 None,此时 pandas 会尝试自动选择引擎。
- 【例】engine='xlsxwriter' # 用于 .xlsx 文件
- 【例】engine='openpyxl' # 用于 .xlsx 文件
- 【例】engine='odswriter' # 用于 .ods 文件
- 【例】engine='xlwt ' # 用于 .xls 文件
- date_format:为写入Excel文件的日期格式化字符串(例如:"YYY-MM-DD")
- datetime_format:为写入Excel文件的日期对象格式化字符串(例如:"YY-MM-DDHH:MM:SS")
- mode:写入模式或追加模式,追加模式不适用于fsspec URLs
- 【例】mode='w' # 表示写入模式(会覆盖文件)
- 【例】mode='a' # 表示追加模式(如果文件不存在会创建一个新文件,但只能在现有工作表后添加新工作表,不能修改现有数据)。注意,并不是所有引擎都支持 'a' 模式。
- storage_options:用于传递给文件存储后端的参数。例如,当使用支持远程存储的引擎时(如通过 fsspec),可以通过这个参数指定存储选项。默认为 None。
- if_sheet_exists:指定当尝试写入的工作表已存在时的行为。(仅限追加模式)应采取的行动。
- 【例】if_sheet_exists='error' # 引起值错误。
- 【例】if_sheet_exists='new' # 创建一个新工作表,名称由引擎决定。
- 【例】if_sheet_exists='replace' # 在写入表格之前删除表格中的内容。
- 【例】if_sheet_exists='overlay' # 将多个 df 写入到同一个sheet页。
- engine_kwargs:一个字典,用于传递给指定引擎的额外关键字参数。这允许你配置引擎特定的选项。
返回值:一个实例化对象。
ExcelWriter
是一个上下文管理器,允许我们使用类似文件的接口保存多个DataFrame到不同的Excel工作表,以下的方法可以将不同的表格存入到不同的工作簿中。
# 创建一个示例DataFrame
df1 = pd.DataFrame({'Column1': [1, 2, 3], 'Column2': ['A', 'B', 'C']})
df2 = pd.DataFrame({'Column1': [4, 5, 6], 'Column2': ['D', 'E', 'F']})
# 使用ExcelWriter保存多个DataFrame到不同的工作表
with pd.ExcelWriter(path='output.xlsx', engine='openpyxl') as writer:
df1.to_excel(writer, sheet_name='Sheet1', index=False)
df2.to_excel(writer, sheet_name='Sheet2', index=False)
使用for
循环,遍历多个dataframe存入excel的不同的sheet页:
# 创建一个示例DataFrame
df1 = pd.DataFrame({'Column1': range(5), 'Column2': range(5, 10)})
df2 = pd.DataFrame({'Column1': range(10, 15), 'Column2': range(10, 15)})
df3 = pd.DataFrame({'Column1': range(20, 25), 'Column2': range(20, 25)})
dataframes = [df1, df2, df3]
with pd.ExcelWriter(path='output.xlsx') as writer: # 读取excel表,写在最外层
for i in range(len(dataframes)): # for循环获取多个dataframe遍历
sheet_name = "sheet_" + str(i) # 起不同的表名
df = dataframes[i]
df.to_excel(writer, sheet_name=sheet_name, index=False)
当然我们在写入的时候如果想做一些其他的设置(比如添加样式、设置列宽等),可以通过指定引擎,再接着进行操作,例如:
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import PatternFill
with pd.ExcelWriter(path='output.xlsx', engine='openpyxl') as writer:
df.to_excel(writer, index=False, sheet_name='Sheet1')
# 获取当前工作簿和工作表
workbook = writer.book
worksheet = writer.sheets['Sheet1']
# 定义填充颜色
fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid') # 黄色背景
# 为指定列(例如列 'A',即第1列)添加颜色
for row in range(2, len(df) + 2): # 从第二行开始(第一行是标题)
worksheet[f'A{row}'].fill = fill # 指定添加颜色的单元格
(3)使用StyleFrame库的ExcelWriter和to_excel
df1 = pd.DataFrame({'Column1': [1, 2, 3], 'Column2': ['A', 'B', 'C']})
df2 = pd.DataFrame({'Column1': [4, 5, 6], 'Column2': ['D', 'E', 'F']})
with StyleFrame.ExcelWriter(path='output.xlsx') as writer:
df1.to_excel(writer, index=False, sheet_name='sheet1')
df2.to_excel(writer, index=False, sheet_name='sheet2')
标签:engine,None,sheet,读取,na,excel,DataFrame,pandas From: https://www.cnblogs.com/crazy-output/p/18616099