pandas操作excel
pandas 提供了便捷的方法来处理 excel 文件,这主要得益于 pandas.read_excel() 和 dataframe.to_excel() 这两个函数。
语法
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, keep_default_na=true, verbose=false, parse_dates=false, date_parser=none, thousands=none, comment=none, skipfooter=0, convert_float=true, mangle_dupe_cols=true, **kwds)
参数
- 文件 io
读取excel 文件
# str, bytes, excelfile, xlrd.book, path object, or file-like object # 本地相对路径: pd.read_excel('data/data.xlsx') # 注意目录层级 pd.read_excel('data.xls') # 如果文件与代码文件在同目录下 # 本地绝对路径: pd.read_excel('/user/wfg/data/data.xlsx') # 使用网址 url pd.read_excel('https://wfg.com/file/data/dataset/team.xlsx')
- 表格 sheet_name
可以指定 excel 文件读取哪个 sheet,默认取第一个。
# str, int, list, or none, default 0 pd.read_excel('tmp.xlsx', sheet_name=1) # 第二个 sheet pd.read_excel('tmp.xlsx', sheet_name='总结表') # 按 sheet 的名字 # 取第一个、第二个、名为 sheet1 的,返回一个 df 组成的字典 dfs = pd.read_excel('tmp.xlsx', sheet_name=[0, 1, "sheet1"]) dfs = pd.read_excel('tmp.xlsx', sheet_name=none) # 所有的 sheet dfs['sheet5'] # 读取时按 sheet 名
- 表头 header
数据的表头,默认为第一行。
pd.read_excel('tmp.xlsx', header=none) # 不设表头 pd.read_excel('tmp.xlsx', header=2) # 第三行为表头 pd.read_excel('tmp.xlsx', header=[0, 1]) # 两层表头,多层索引
- 列名/表头名 names
默认取数据中默认的表头名称,可以重新指定。
# array-like, default none pd.read_excel('tmp.xlsx', names=['姓名', '年龄', '成绩']) pd.read_excel('tmp.xlsx', names=c_list) # 传入列表变量 # 没有表头,需要设置为 none pd.read_excel('tmp.xlsx', header=none, names=none)
- 索引列 index_col
作为索引的列,默认不设置,使用自然索引(从 0 开始)。
# int, list of int, default none pd.read_excel('tmp.xlsx', index_col=0) # 指定第一列 pd.read_excel('tmp.xlsx', index_col=[0,1]) # 前两列,多层索引
- 使用列 usecols
指定使用的列,其余的不读取,默认是全部使用。
# int, str, list-like, or callable default none pd.read_excel('tmp.xlsx', usecols='a,b') # 取 a 和 b 两列 pd.read_excel('tmp.xlsx', usecols='a:h') # 取 a 到 h 列 pd.read_excel('tmp.xlsx', usecols='a,c,e:h') # 取 a和c列,再加e到h列 pd.read_excel('tmp.xlsx', usecols=[0,1]) # 取前两列 pd.read_excel('tmp.xlsx', usecols=['姓名','性别']) # 取指定列名的列 # 表头包含 q 的 pd.read_excel('team.xlsx', usecols=lambda x: 'q' in x)
- 返回序列 squeezebool
如果只要一列,则返回一个 series,默认还是 dataframe。
# default false pd.read_excel('tmp.xlsx', usecols='a', squeezebool=true)
- 数据类型 dtype
数据类型,如果不传则自动推断。如果被 converters 处理则不生效。
# type name or dict of column -> type, default none pd.read_excel(data, dtype=np.float64) # 所有数据均为此数据类型 pd.read_excel(data, dtype={'c1':np.float64, 'c2': str}) # 指定字段的类型 pd.read_excel(data, dtype=[datetime, datetime, str, float]) # 依次指定
- 处理引擎 engine
可接受的参数值是 “xlrd”, “openpyxl” 或者 “odf”,如果文件不是缓冲或路径,就需要指定,用于处理 excel 使用的引擎,三方库。
# str, default none pd.read_excel('tmp.xlsx', engine='xlrd')
在实践中,默认的 xlrd 引擎不会读取内容为星号*、百分号 % 等特殊字符的行,可以更换为 openpyxl 解决。
- 列数据处理 converters
对列的数据进行转换,列名与函数组成的字典。key 可以是列名或者列的序号。
# dict, default none def foo(p): return p + 's' # x 应用函数, y 使用 lambda pd.read_excel('tmp.xlsx', converters={'x': foo, 'y': lambda x: x * 3}) # 使用列索引 pd.read_excel('tmp.xlsx', converters={0: foo, 1: lambda x: x * 3})
- 真假值指定 true_values false_values
将指定的文本转换为 true 或者 false, 可以用列表指定多个值。
# list, default none pd.read_excel('tmp.xlsx', true_values=['yes'], false_values=['no'])
- 跳过指定行 skiprows
# list-like, int or callable, optional # 跳过前三行 pd.read_excel(data, skiprows=2) # 跳过前三行 pd.read_excel(data, skiprows=range(2)) # 跳过指定行 pd.read_excel(data, skiprows=[24,234,141]) # 跳过指定行 pd.read_excel(data, skiprows=np.array([2, 6, 11])) # 隔行跳过 pd.read_excel(data, skiprows=lambda x: x % 2 != 0) # 跳过最后几行用 skipfooter=2
- 读取行数 nrows
需要读取的行数,从文件开头算起,经常用于较大的数据,先取部分进行代码编写。
# int, default none pd.read_excel(data, nrows=1000)
- 空值替换 na_values
一组用于替换 na/nan 的值。如果传参,需要制定特定列的空值。
# scalar, str, list-like, or dict, default none # 5 和 5.0 会被认为 nan pd.read_excel(data, na_values=[5]) # ? 会被认为 nan pd.read_excel(data, na_values='?') # 空值为 nan pd.read_excel(data, keep_default_na=false, na_values=[""]) # 字符 na 字符 0 会被认为 nan pd.read_excel(data, keep_default_na=false, na_values=["na", "0"]) # nope 会被认为 nan pd.read_excel(data, na_values=["nope"]) # a、b、c 均会被认为 nan 等于 na_values=['a','b','c'] pd.read_excel(data, na_values='abc') # 指定列的指定值会被认为 nan pd.read_excel(data, na_values={'c':3, 1:[2,5]})
- 保留默认空值 keep_default_na
分析数据时是否包含默认的nan值,是否自动识别。如果指定 na_values 参数,并且 keep_default_na=false,那么默认的nan将被覆盖,否则添加。
和 na_values 的关系是:
keep_default_na | na_values | 逻辑 |
---|---|---|
true | 指定 | na_values 的配置附加处理 |
true | 未指定 | 自动识别 |
false | 指定 | 使用 na_values 的配置 |
false | 未指定 | 不做处理 |
注:如果 na_filter 为 false (默认是 true), 那么 keep_default_na 和 na_values parameters 均无效。
# boolean, default true # 不自动识别空值 pd.read_excel(data, keep_default_na=false)
- 丢失值检查 na_filter
是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=false 可以提升读取速度。
# boolean, default true pd.read_excel(data, na_filter=false) # 不检查
- 解析信息 verbose
是否打印各种解析器的输出信息,例如:“非数值列中缺失值的数量”等。
# boolean, default false # 可以看到解析信息 pd.read_excel(data, verbose=true) # tokenization took: 0.02 ms # type conversion took: 0.36 ms # parser memory cleanup took: 0.01 ms
- 日期时间解析 parse_dates
本参数对时间日期进行解析。
# boolean or list of ints or names or list of lists or dict, default false. pd.read_excel(data, parse_dates=true) # 自动解析日期时间格式 pd.read_excel(data, parse_dates=['年份']) # 指定日期时间字段进行解析 # 将 1、4 列合并解析成名为 时间的 时间类型列 pd.read_excel(data, parse_dates={'时间':[1,4]})
- 日期时间解析器 date_parser
用于解析日期的函数,默认使用dateutil.parser.parser来做转换。pandas 尝试使用三种不同的方式解析,如果遇到问题则使用下一种方式。
- 使用一个或者多个arrays(由parse_dates指定)作为参数;
- 连接指定多列字符串作为一个列作为参数;
- 每行调用一次date_parser函数来解析一个或者多个字符串(由parse_dates指定)作为参数。
# function, default none # 指定时间解析库,默认是 dateutil.parser.parser date_parser=pd.io.date_converters.parse_date_time date_parser=lambda x: pd.to_datetime(x, utc=true, format='%d%b%y') date_parser = lambda d: pd.datetime.strptime(d, '%d%b%y') # 使用 pd.read_excel(data, parse_dates=['年份'], date_parser=date_parser)
- 千分位分割符 thousands
千位分隔符。
# str, default none pd.read_excel(data, thousands=',') # 逗号分隔
- 注释标识 comment
指示不应分析行的部分。 如果在一行的开头找到该行,则将完全忽略该行。 此参数必须是单个字符。 像空行一样(只要skip_blank_lines = true),参数视为header会忽略完全注释的行,而skiprows 行会忽略。 例如,如果comment =‘#’,则解析header= 0的’#empty \ na,b,c \ n1,2,3’会将’a,b,c’视为header。
# str, default none s = '# notes\na,b,c\n# more notes\n1,2,3' # 仅为示例 pd.read_excel(data, sep=',', comment='#', skiprows=1)
- 尾部跳过 skipfooter
从文件尾部开始忽略。 (c引擎不支持)
# int, default 0 pd.read_excel(filename, skipfooter=1) # 最后一行不加载
- 转为浮点 convert_float
读取 excel 默认把数字转为浮点,设为 false 将保留整型。
# bool, default true pd.read_excel('tmp.xlsx', convert_float=false)
- mangle_dupe_cols
- 处理重复列名 mangle_dupe_cols
当列名有重复时,解析列名将变为 ‘x’, ‘x.1’…’x.n’而不是 ‘x’…’x’。
如果该参数为 false ,那么当列名中有重复时,前列将会被后列覆盖。
# bool, default true data = 'a,b,a\n0,1,2\n3,4,5' # 仅为示例 pd.read_excel(data, mangle_dupe_cols=true) # 表头为 a b a.1 # false 会报 valueerror 错误
- 存储选项 storage_options
**其他参数 kwds
textfilereader 处理的其他参数。
返回:一般情况下,会将读取到的数据返回一个 dataframe,当然按照参数的要求会返回指定的类型。
示例:pandas 提供了便捷的方法来处理 excel 文件,这主要得益于 pandas.read_excel() 和 dataframe.to_excel() 这两个函数。以下是使用 pandas 操作 excel 文件的一些关键步骤和示例:
- 读取 excel 文件
要读取 excel 文件中的数据,你可以使用 pandas.read_excel() 函数。这个函数能够读取指定工作表中的数据,并将其转换为一个 pandas dataframe 对象。
import pandas as pd # 读取 excel 文件中的特定工作表 df = pd.read_excel('example.xlsx', sheet_name='sheet1') # 如果需要读取所有工作表,可以将 sheet_name 设置为 none,这将返回一个包含所有工作表数据的字典 sheets = pd.read_excel('example.xlsx', sheet_name=none)
- 处理读取的数据
一旦数据被读取到 dataframe 中,你就可以使用 pandas 提供的各种函数和方法来处理这些数据了。例如,你可以对数据进行筛选、排序、分组、聚合等操作。
# 假设我们有一个名为 'df' 的 dataframe # 筛选出某列值满足特定条件的行 filtered_df = df[df['column_name'] > some_value] # 对数据进行排序 sorted_df = df.sort_values(by='column_name')
- 将数据写回 excel 文件
处理完数据后,你可能希望将结果保存回 excel 文件中。这时,你可以使用 dataframe.to_excel() 方法。
# 将 dataframe 写入新的 excel 文件 df.to_excel('output.xlsx', sheet_name='sheet1', index=false) # 如果你想将多个 dataframe 写入同一个 excel 文件的不同工作表,可以使用 excelwriter with pd.excelwriter('multiple_sheets.xlsx') as writer: df1.to_excel(writer, sheet_name='sheet1', index=false) df2.to_excel(writer, sheet_name='sheet2', index=false)
注意事项:
- 文件路径:确保你提供的文件路径是正确的,并且程序有足够的权限去读取和写入文件。
- 工作表名称:在读取或写入工作表时,确保指定的工作表名称是存在的,或者你已经正确地处理了工作表不存在的情况。
- 数据类型:在读取和写入数据时,注意数据类型的兼容性。例如,如果 excel 文件中的日期是以文本格式存储的,你可能需要在读取后进行类型转换。
- 性能:对于大型数据集,读取和写入 excel 文件可能会比较慢,并且可能会受到内存限制。在这种情况下,你可以考虑将数据分批处理或使用更适合大数据集的格式(如 csv)。
- 依赖项:pandas 使用 openpyxl 或 xlrd 库来读取和写入 excel 文件(xlrd 从版本 2.0.0 开始不再支持 .xlsx 格式,因此推荐使用 openpyxl)。确保你已经安装了这些库。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论