Pandas 操作Excel

Pandas 提供了便捷的方法来处理 Excel 文件,这主要得益于 pandas.read_excel() 和 DataFrame.to_excel() 这两个函数。

语法

python 复制代码
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 文件
python 复制代码
# 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,默认取第一个。
python 复制代码
# 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
    数据的表头,默认为第一行。
python# 复制代码
pd.read_excel('tmp.xlsx', header=None)  # 不设表头
pd.read_excel('tmp.xlsx', header=2)  # 第三行为表头
pd.read_excel('tmp.xlsx', header=[0, 1])  # 两层表头,多层索引
  • 列名/表头名 names
    默认取数据中默认的表头名称,可以重新指定。
python 复制代码
# 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 开始)。
python 复制代码
# int, list of int, default None
pd.read_excel('tmp.xlsx', index_col=0) # 指定第一列
pd.read_excel('tmp.xlsx', index_col=[0,1]) # 前两列,多层索引
  • 使用列 usecols
    指定使用的列,其余的不读取,默认是全部使用。
python 复制代码
# 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。
python 复制代码
# default False
pd.read_excel('tmp.xlsx', usecols='A', squeezebool=True)
  • 数据类型 dtype
    数据类型,如果不传则自动推断。如果被 converters 处理则不生效。
python 复制代码
# 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 使用的引擎,三方库。
python 复制代码
# str, default None
pd.read_excel('tmp.xlsx', engine='xlrd')

在实践中,默认的 xlrd 引擎不会读取内容为星号*、百分号 % 等特殊字符的行,可以更换为 openpyxl 解决。

  • 列数据处理 converters
    对列的数据进行转换,列名与函数组成的字典。key 可以是列名或者列的序号。
python 复制代码
# 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, 可以用列表指定多个值。
python 复制代码
# list, default None
pd.read_excel('tmp.xlsx',
            true_values=['Yes'], false_values=['No'])
  • 跳过指定行 skiprows
python 复制代码
# 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
    需要读取的行数,从文件开头算起,经常用于较大的数据,先取部分进行代码编写。
python 复制代码
# int, default None
pd.read_excel(data, nrows=1000)
  • 空值替换 na_values
    一组用于替换 NA/NaN 的值。如果传参,需要制定特定列的空值。
python 复制代码
# 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 均无效。

python 复制代码
# boolean, default True
# 不自动识别空值
pd.read_excel(data, keep_default_na=False)
  • 丢失值检查 na_filter
    是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=False 可以提升读取速度。
python 复制代码
# boolean, default True
pd.read_excel(data, na_filter=False) # 不检查
  • 解析信息 verbose
    是否打印各种解析器的输出信息,例如:"非数值列中缺失值的数量"等。
python 复制代码
# 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
    本参数对时间日期进行解析。
python 复制代码
# 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指定)作为参数。
python 复制代码
# 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
    千位分隔符。
python 复制代码
# 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。
python 复制代码
# str, default None
s = '# notes\na,b,c\n# more notes\n1,2,3' # 仅为示例
pd.read_excel(data, sep=',', comment='#', skiprows=1)
  • 尾部跳过 skipfooter
    从文件尾部开始忽略。 (c引擎不支持)
python 复制代码
# int, default 0
pd.read_excel(filename, skipfooter=1) # 最后一行不加载
  • 转为浮点 convert_float
    读取 Excel 默认把数字转为浮点,设为 False 将保留整型。
python 复制代码
# 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 ,那么当列名中有重复时,前列将会被后列覆盖。
python 复制代码
# 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 对象。
python 复制代码
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 提供的各种函数和方法来处理这些数据了。例如,你可以对数据进行筛选、排序、分组、聚合等操作。
python 复制代码
# 假设我们有一个名为 'df' 的 DataFrame
# 筛选出某列值满足特定条件的行
filtered_df = df[df['column_name'] > some_value]
 
# 对数据进行排序
sorted_df = df.sort_values(by='column_name')
  • 将数据写回 Excel 文件
    处理完数据后,你可能希望将结果保存回 Excel 文件中。这时,你可以使用 DataFrame.to_excel() 方法。
python 复制代码
# 将 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)。确保你已经安装了这些库。
相关推荐
CircleMouse8 小时前
如何设置wps单元格下拉选项设置
excel·wps
zhangjin122213 小时前
kettle插件-excel插件,kettle读取excel动态表头,kettle根据列名读取excel
excel·kettle·kettle excel插件·kettle 动态excel
远洪1 天前
excel 找出两列不同的数据
excel
pcplayer1 天前
非常好用的 Excel 读写控件
excel·delphi·office
Navicat中国1 天前
使用 Navicat 导入向导导入 Excel 数据时,系统提示导入成功,表中也能看到数据,但行数统计显示为 0,这是什么原因?
数据库·excel·导入
穿着内裤的外星人1 天前
触控精灵远程读写Excel步骤配置
excel
是孑然呀2 天前
【小记】excel vlookup一对多(第二篇)
excel
开开心心就好2 天前
专为视障人士设计的免费辅助工具
windows·计算机视觉·计算机外设·excel·散列表·推荐算法·csdn开发云
transformer_WSZ2 天前
excel两列数据绘制折线图
excel·折线图
蒋胜山2 天前
Excel 练习题(5)
经验分享·excel