问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Pandas读取Excel文件的常用方法

创作时间:
作者:
@小白创作中心

Pandas读取Excel文件的常用方法

引用
CSDN
1.
https://blog.csdn.net/weixin_74727170/article/details/146217376

在数据处理和分析中,Excel文件是一种常见的数据存储格式。Pandas作为Python中强大的数据处理库,提供了丰富的功能来读取和处理Excel文件。本文将详细介绍如何使用Pandas的read_excel函数读取Excel文件,包括指定工作表、跳过行、选择列、处理缺失值等常用方法。此外,还将介绍ExcelFile类的使用,以及如何通过URL读取Excel文件。

一、read_excel函数

1. 接受一个工作表

在实际场景中,Excel文件可能并不规整。Pandas提供了一些参数来优化读取过程。例如,对于store.xlsx文件的三个工作表:

通过sheet_nameskiprowsusecols这些参数,可以告诉Pandas关于想要读取的列的详细信息:

  • sheet_name="2019":指定了要读取的工作表名称。sheet_name接受工作表切片。闭区间,包括起始和结束的工作表。

  • 单个工作表:sheet_name="Sheet1"

  • 多个工作表(列表):sheet_name=["Sheet1", "Sheet2"]

  • 工作表切片:sheet_name="Sheet1:Sheet3"sheet_name=0:3(使用索引)

  • skiprows=1:用于跳过文件开头指定数量的行。在这个例子中,skiprows=1表示跳过文件的第一行,从第二行开始读取数据。

  • usecols="B:F":用于指定要读取的列范围。读取从列B到列F的数据(包括B和F列)。

补充:Flagship的数据类型应该是bool而不是object。要修正这一问题,需要提供一个转换函数来处理某列中发生冲突的单元格。(编写fix_missing函数或者写一个lambda表达式)

Flagship列中的非布尔值处理为False,而将有效的布尔值保留为TrueFalse

Flagship列的数据类型是object,而不是bool。这是因为该列中包含了一些非布尔值(如MISSINGNaN),导致Pandas无法自动将其转换为布尔类型。

1. 编写函数

import pandas as pd
import numpy as np

# 定义fix_missing函数
def fix_missing(value):
    if isinstance(value, bool):
        return value
    else:
        return False

# 读取数据
df = pd.read_excel("xl/stores.xlsx", sheet_name="2019", skiprows=1, usecols="B:F")

# 应用fix_missing函数到Flagship列
df['Flagship'] = df['Flagship'].apply(fix_missing)

# 打印修正后的DataFrame
print(df)

2. 使用lambda表达式

import pandas as pd

# 读取数据
df = pd.read_excel("xl/stores.xlsx", sheet_name="2019", skiprows=1, usecols="B:F")

# 使用lambda表达式将Flagship列中非布尔值转换为False
df['Flagship'] = df['Flagship'].apply(lambda x: x if isinstance(x, bool) else False)

# 打印修正后的DataFrame
print(df)

apply()方法用于对DataFrame的每一列应用一个函数。lambda x: x if isinstance(x, bool) else False是一个匿名函数,它检查每个元素x。如果x是布尔类型(TrueFalse),则保留原值。如果x不是布尔类型(例如,MISSINGNaN),则将其转换为Falseisinstance(x, bool)是一个内置函数,用于检查变量x是否是布尔类型(bool)。

3. 结合使用converters参数

converters参数用于指定列的自定义转换函数。这允许你在数据读取过程中,对特定列的数据进行预处理或转换。converters是一个字典,其中键是列名(或列索引),值是应用于该列的转换函数。当pandas.read_excel读取数据时,会使用这些转换函数来处理指定列的数据。

def fix_missing(x):
    return False if x in ["", "MISSING"] else x

df = pd.read_excel(
    "xl/stores.xlsx",
    sheet_name="2019",
    skiprows=1,
    usecols="B:F",
    converters={"Flagship": fix_missing}
)

fix_missing函数:这个函数用于检查传入的值x。如果x是一个空字符串""或字符串"MISSING",则返回False。否则,返回原始值x

converters={"Flagship": fix_missing}:这里指定了一个转换字典,其中键是"Flagship",表示要对Flagship列应用转换。值是fix_missing函数,这意味着在读取Flagship列的数据时,每个单元格的值都会通过fix_missing函数进行处理。

2. 接受一个工作表名称列表

在Pandas库中,read_excel函数可以读取Excel文件中的一个或多个工作表。当你想要读取多个工作表时,可以通过传递一个工作表名称的列表或者使用sheet_name=None来读取所有的工作表。这将返回一个字典,其中键是工作表名称,值是对应的DataFrame

假设你有一个Excel文件data.xlsx,其中包含以下三个工作表:

  • Sheet1:包含学生基本信息。
  • Sheet2:包含学生的成绩。
  • Sheet3:包含学生的出勤记录。
import pandas as pd

# 读取Excel文件中的所有工作表
sheets = pd.read_excel("data.xlsx", sheet_name=None)

# `sheets`是一个字典,键是工作表名称,值是对应的DataFrame
print(sheets.keys())  # 输出: dict_keys(['Sheet1', 'Sheet2', 'Sheet3'])

# 访问特定工作表的DataFrame
students_info = sheets['Sheet1']
students_grades = sheets['Sheet2']
students_attendance = sheets['Sheet3']

# 打印Sheet1的数据
print(students_info)

补充:usecols参数。用于指定要读取的列名,从而只导入你感兴趣的数据,忽略其他列。

import pandas as pd

# 读取Excel文件中的两个工作表"2019"和"2020"
sheets = pd.read_excel(
    "xl/stores.xlsx",
    sheet_name=["2019", "2020"],
    skiprows=1,
    usecols=["Store", "Employees"]
)

# 打印2019年工作表的前两行
print(sheets["2019"].head(2))

.head(2)方法打印该DataFrame的前两行。

3. 设置列名

源文件没有列标题,可以设置参数header=None并通过names参数提供对应的列名。

import pandas as pd

df = pd.read_excel(
    "xl/stores.xlsx",
    sheet_name=0,
    skiprows=2,
    skipfooter=3,
    usecols="B:C,F",
    header=None,
    names=["Branch", "Employee_Count", "Is_Flagship"]
)
  • sheet_name=0:指定读取Excel文件的第一个工作表。
  • skiprows=2:跳过文件开头的2行。
  • skipfooter=3:跳过文件末尾的3行。
  • usecols="B:C,F":指定要读取的列。"B:C"表示读取从B列到C列的所有列(包括B和C列)。"F"表示读取F列。
  • header=None:指定Excel文件中没有列标题行。规定不要将文件中的任何一行用作列名。
  • names=["Branch", "Employee_Count", "Is_Flagship"]:由于header=None,我们需要通过names参数提供自定义的列名。这里为读取的列指定了名称:"Branch"、"Employee_Count"和"Is_Flagship"。

4. 处理缺失值

使用na_valueskeep_default_na参数。

import pandas as pd

df = pd.read_excel(
    "xl/stores.xlsx",
    sheet_name="2019",
    skiprows=1,
    usecols="B,C,F",
    skipfooter=2,
    na_values="MISSING",
    keep_default_na=False
)
  • na_values="MISSING":指定将"MISSING"视为缺失值(NaN)。任何在数据中出现的"MISSING"都会被转换为NaN
  • keep_default_na=False:指定不保留Pandas默认的缺失值标识符。默认情况下,Pandas会将空字符串""'nan''null''NULL'等识别为缺失值并转换为NaN。设置为False后,只有na_values中指定的值(如"MISSING")会被视为缺失值。

二、ExcelFile

1. 什么是ExcelFile

使用ExcelFile类,你可以一次性加载整个Excel文件,然后根据需要选择性地解析各个工作表,从而提高数据处理的效率。

2. 为什么有ExcelFile

当需要从同一个Excel文件中读取多个工作表时,直接使用read_excel函数可能会多次打开和读取整个文件,导致性能下降。而ExcelFile类允许你一次性打开文件,并在内存中保持打开状态,从而避免了重复的文件读取操作。ExcelFile类可以被用作上下文管理器(使用with语句),这意味着文件会在使用后被自动关闭,从而避免了资源泄漏的问题。当使用with语句来打开ExcelFile时,Pandas会自动处理文件的打开和关闭。

3. 如何使用ExcelFile

1. 导入Pandas库

import pandas as pd

2. 创建ExcelFile对象

传入Excel文件的路径。

补充:通过ExcelFile访问所有工作表的名称

3. 读取工作表

使用pd.read_excel函数读取ExcelFile对象中的特定工作表。

4. (可选)使用上下文管理器

为了确保文件在使用后被正确关闭,可以使用with语句来管理ExcelFile对象。

补充:上下文管理器和with语句

Python中的with语句被用于管理文件或数据连接之类的资源。如果你想加载最新的销售数据以便对其进行分析,就必须打开一个文件或者建立一个数据库连接。在数据读取完成后,最好尽快关闭文件或者数据库连接。否则,你可能会无法打开其他文件或者建立新的数据库连接。

手动打开和关闭文本文件的代码:

执行这段代码会在笔记本的工作目录中创建一个叫作output.txt的文件,并将"Some text"写入文件。要读取一个文件,需要使用r模式而不是w模式;要在文件末尾追加内容,则需要使用a模式。

文件的打开和关闭是一种相当常见的操作,因此Python提供了with语句来简化这类代码:

当代码的执行过程离开with语句的主体时,无论是否发生异常,文件都会被自动关闭。支持with语句的对象被称作上下文管理器。ExcelFile对象和ExcelWriter对象,数据库连接对象都是上下文管理器。

5. 示例

pd.ExcelFile("xl/stores.xls"):使用Pandas的ExcelFile类来打开和加载名为"xl/stores.xls"的Excel文件。
as f:将创建的ExcelFile对象赋值给变量f。这样,在with语句的作用域内,你可以通过f来引用这个ExcelFile对象。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号