Pandas read_excel
是一个函数蟒蛇熊猫库允许我们在 Python 中读取 Excel 文件并将其转换为数据框 object.
read_excel函数可以导入具有不同扩展名的Excel文件,例如.xls、.xlsx、.xlsm和.ods。
Pandas read_excel 可以做什么?
该功能提供了大量参数来定制您的数据读取。例如,您可以指定工作表名称、读取多个工作表、选择标题行、读取时跳过行或列、定义列的数据类型、转换任何列数据等等。
在本教程中,我们将深入探讨您可以使用read_excel
函数在 Python pandas 中读取和操作 Excel 文件中的数据。
发动机参数
read_excel 函数中的engine 参数指定用于读取Excel 文件的引擎。选项包括“xlrd”、“openpyxl”、“odf”和“xlsb”。
“xlrd”支持旧式 Excel 文件 (.xls),openpyxl 支持较新的 Excel 文件格式 (.xlsx),“odf”支持 OpenDocument 格式 (.ods),“xlsb”支持二进制 Excel 格式。
如果您尝试在未安装所需引擎的情况下读取 Excel 文件,您将收到导入错误。
首先,你应该安装你需要的引擎,在我们的例子中,我们有一个(.xlsx)文件,所以我们需要安装 openpyxl。
pip install openpyxl
如果您需要读取(.ods)文件,您应该安装odfpy:
pip install odfpy
现在,让我们阅读我们的文件:
df = pd.read_excel('school_data.xlsx', engine='openpyxl')
print(df)
Output:
Student_ID Name Grade Score
0 1 Alice 10 85
1 2 Bob 9 92
2 3 Carol 8 78
...
阅读 Excel 工作表
在某些情况下,我们可能希望从包含多个工作表的 Excel 文件中读取单个工作表。为此,我们在 read_excel 函数中指定sheet_name 参数:
df = pd.read_excel('school_data.xlsx', sheet_name='Students')
print(df)
Output:
Student_ID Name Grade Score
0 1 Alice 10 85
1 2 Bob 9 92
2 3 Carol 8 78
...
在上面的示例中,我们从学校数据 Excel 文件中读取第一个工作表“学生”。
阅读多张纸
要从 Excel 文件读取多个工作表,请将工作表列表传递给sheet_name 参数。结果将是一个字典,其中键是工作表名称,值是数据帧。
all_sheets_df = pd.read_excel('school_data.xlsx', sheet_name=['Students', 'Teachers'])
print(all_sheets_df['Students'])
print(all_sheets_df['Teachers'])
Output:
Students DataFrame:
Student_ID Name Grade Score
0 1 Alice 10 85
1 2 Bob 9 92
2 3 Carol 8 78
...
Teacher_ID Name Subject
0 1 Alex English
1 2 Brenda Math
2 3 Charles Science
...
在这里,我们从学校数据 Excel 文件中读取了两张表“学生”和“教师”。
默认情况下,pandas 假定第一行是标题。但是,我们可以使用“header”参数来指定组成标题的行:
df = pd.read_excel('school_data.xlsx', header=0)
print(df)
Output:
Student_ID Name Grade Score
0 1 Alice 10 85
1 2 Bob 9 92
2 3 Carol 8 78
...
在这里,我们指定header=0
,这表明我们选择了第一行(Pandas 的索引为 0)作为标题行。
如果您希望第一行不被视为标题,可以设置 header=None。
df = pd.read_excel('school_data.xlsx', header=None)
print(df)
Output:
0 1 2 3
Student_ID Name Grade Score
0 1 Alice 10 85
1 2 Bob 9 92
2 3 Carol 8 78
...
这意味着第一行将被视为数据行,而不是标题。
设置数据帧index_col
“index_col”参数允许我们指定用作 DataFrame 行标签的列。让我们将“Student_ID”列设置为索引:
df = pd.read_excel('school_data.xlsx', index_col='Student_ID')
print(df)
Output:
Name Grade Score
Student_ID
1 Alice 10 85
2 Bob 9 92
3 Carol 8 78
...
在此示例中,我们将“Student_ID”设置为 DataFrame 的索引,它现在用作行标签。
跳行
您可以使用skiprows参数在读取Excel文件时跳过行。您可以传递一个整数来从顶部跳过一定数量的行,或者传递一个行索引列表来跳过特定行:
df = pd.read_excel('school_data.xlsx', skiprows=1)
print(df)
Output:
1 Alice 10 85
0 2 Bob 9 92
1 3 Carol 8 78
...
在本例中,我们通过设置跳过了 DataFrame 的第一行skiprows=1
。因此,以前的第二行现在被视为标题行。
df = pd.read_excel('school_data.xlsx',skiprows=[1,3])
print(df)
在上面的代码中,第一行和第三行被跳过。
有条件跳过
Skiprows 参数还接受一个可调用函数,允许基于条件的行跳过。
该函数根据行索引进行计算,并且函数返回 True 的行将被跳过:
# Function to skip even rows
skip_func = lambda x: x % 2 == 0
df = pd.read_excel('school_data.xlsx', skiprows=skip_func)
print(df)
Output:
Student_ID Name Grade Score
0 1 Alice 10 85
1 3 Carol 8 78
...
我们通过定义一个函数跳过了每个偶数行skip_func
如果行索引为偶数,则返回 True。
限制读取的行数
当您想要从 Excel 文件中读取一定数量的行时,可以使用 nrows 参数。例如,仅读取前五行:
df = pd.read_excel('school_data.xlsx', nrows=5)
print(df)
Output:
Student_ID Name Grade Score
0 1 Alice 10 85
1 2 Bob 9 92
2 3 Carol 8 78
3 4 David 10 88
4 5 Emily 9 81
通过设置nrows=5
,我们将 DataFrame 限制为仅包含 Excel 数据的前五行。
提取特定列(跳过列)
如果您对 Excel 文件中的特定列感兴趣,可以使用 usecols 参数。这可以是列名称列表或为要解析的列返回 True 的可调用函数:
df = pd.read_excel('school_data.xlsx', usecols=['Name', 'Score'])
print(df)
Output:
Name Score
0 Alice 85
1 Bob 92
2 Carol 78
...
在本例中,我们仅从 Excel 文件中读取“名称”和“分数”列。如果您正在处理大型数据集并且只需要列的子集,这可以节省大量内存。
另外,您可以将函数传递给 usecols,如下所示:
def column_filter(col_name):
return col_name.startswith('S')
df = pd.read_excel('school_data.xlsx', usecols=column_filter)
Output:
Student_ID Score
0 1 85
1 2 92
2 3 78
...
在这里,我们只返回以“S”字符开头的列。
控制数据类型
默认情况下,Pandas 尝试推断每列的最佳数据类型。但有时,您可能想要强制执行特定类型,这可以使用“dtype”参数来完成。
这可以是单个类型或将列名映射到数据类型的字典:
df = pd.read_excel('school_data.xlsx', dtype={'Score': 'int'})
print(df.dtypes)
Output:
Student_ID int64
Name object
Grade int64
Score int32
dtype: object
在这里,我们指定“Score”列应被视为整数 (int32)。生成的 DataFrame 验证此数据类型。
处理布尔数据
有时,Excel 文件可能包含表示为非标准值(例如“是/否”或“Y/N”)的布尔数据。
“true_values”和“false_values”参数允许您指定哪些值应被视为 True 或 False:
df = pd.read_excel('school_data.xlsx', true_values=['Y'], false_values=['N'])
print(df)
Output:
Student_ID Name Grade Score Passed
0 1 Alice 10 85 True
1 2 Bob 9 92 True
2 3 Carol 8 78 False
...
在上面的示例中,“Passed”列中的“Y”被解释为 True,“N”被解释为 False。
转换器参数
Converters 参数允许您在导入过程中将函数应用于特定列。这对于在加载数据时对其执行转换非常有用:
# Function to capitalize names
capitalize = lambda x: x.capitalize()
df = pd.read_excel('school_data.xlsx', converters={'Name': capitalize})
print(df)
Output:
Student_ID Name Grade Score
0 1 Alice 10 85
1 2 Bob 9 92
2 3 Carol 8 78
...
在这里,由于应用了“大写”功能,“名称”列值在导入过程中被大写。
解析日期列
‘parse_dates’参数有助于将类似日期的数据转换为日期时间对象:
df = pd.read_excel('school_data.xlsx', parse_dates=['DOB'])
print(df.dtypes)
Output:
Student_ID int64
Name object
Grade int64
DOB datetime64[ns]
dtype: object
在此示例中,我们将“DOB”列解析为日期时间对象。这在某些情况下非常有用,例如在两个日期之间搜索或查找日期大于或小于特定日期的行。
处理非美国日期格式
Pandas’ read_excel
解析日期时,函数默认使用美国日期格式 (mm/dd/yyyy)。但是,您可能会遇到日期采用非美国格式(例如 dd/mm/yyyy)的 Excel 文件。
为了正确解析非美国日期格式,我们必须首先将日期加载为字符串类型,然后使用pd.to_datetime
具有正确的格式:
df = pd.read_excel('students.xlsx', dtype={'Enrollment Date': str})
df['Enrollment Date'] = pd.to_datetime(df['Enrollment Date'], format='%d/%m/%Y')
print(df['Enrollment Date'])
Output:
0 2022-09-01
1 2022-09-02
2 2022-09-03
3 2022-09-04
Name: Enrollment Date, dtype: datetime64[ns]
在此示例中,加载数据后,“注册日期”被正确解析为“dd/mm/yyyy”格式的日期列。
处理 NaN 值
默认情况下,read_excel 函数将空单元格解释为 NaN。但是,如果您的单元格包含另一个值而不是空值,会发生什么情况?
您可以使用“na_values”参数指定 Pandas 如何处理缺失值或 NaN 的单元格:
df = pd.read_excel('school_data.xlsx', na_values='N/A')
print(df)
Output:
Student_ID Name Grade Score
0 1 Alice 10 85.0
1 2 Bob 9 92.0
2 3 Carol 8 NaN
...
在此示例中,只要在 Excel 数据中找到“N/A”,它就会被 DataFrame 中的 NaN 值替换。
这些只是“pandas read_excel”函数提供的众多强大功能中的一小部分。
每个参数都可以让您更好地控制如何将数据从 Excel 文件导入到 pandas DataFrame 中。