Excel 在工作中很常用,它在数据整理、分析和可视化方面很强大,熟练使用 excel 可以大幅提高工作效率,但如果数据量超大,Excel 可能就会内存溢出,导致文件无法打开,更别提使用了,而 Python 的 pandas 数据分析包就可以很好的解决这个问题。
通过 pandas 的 read_excel() 函数来读取 Excel 表格,返回的是 DataFrame 数据类型。
接下来我们就来详细的了解一下 read_excel() 的参数:
import pandas as pd
stu_result = 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, skip_footer=0, skipfooter=0, convert_float=True,
mangle_dupe_cols=True, **kwds)
下面举例使用的表格是一个简单的excel学习成绩统计表,大家可以自己做一个excel表(注意:表格的后缀名是.xlsx 而不是 .xls , 否则会报错)
建议使用英文路径以及英文命名方式
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io)
print(stu_result)
输出:
学号 姓名 语文 数学 英语
0 1001 张三 90 88 76
1 1002 李四 98 79 90
2 1003 王五 78 78 0
3 1004 老刘 89 99 67
4 1005 老胡 90 100 87
5 1006 老王 77 88 8
可以是整数、列表名,也可以是上述组成的列表。
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, sheet_name = 1)
print(stu_result)
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, sheet_name= "二年级" )
print(stu_result)
stu_result = pd.read_excel(io, sheet_name= "Sheet3" )
print(stu_result)
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, sheet_name=["一年级", 2])
print(stu_result)
输出:
OrderedDict([('一年级', 学号 姓名 语文 数学 英语
0 1001 张三 90 88 76
1 1002 李四 98 79 90
2 1003 王五 78 78 0
3 1004 老刘 89 99 67
4 1005 老胡 90 100 87
5 1006 老王 77 88 8), (2, 学号 姓名 语文 数学 英语
0 a 老三 90 88 76
1 b 老四 98 79 90
2 c 老五 78 78 0
3 d 老刘 89 99 67
4 e 老胡 90 100 87
5 f 老王 77 88 8)])
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, sheet_name="一年级", header=2)
print(stu_result)
stu_result = pd.read_excel(io, sheet_name="一年级", header=[0, 2])
print(stu_result)
输出:
1002 李四 98 79 90
0 1003 王五 78 78 0
1 1004 老刘 89 99 67
2 1005 老胡 90 100 87
3 1006 老王 77 88 8
学号 姓名 语文 数学 英语
1002 李四 98 79 90
0 1003 王五 78 78 0
1 1004 老刘 89 99 67
2 1005 老胡 90 100 87
3 1006 老王 77 88 8
一般适用于Excel缺少列名,或者需要重新定义列名的情况(注意:names的长度必须和excel 的列数一致,否则会报错)
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, sheet_name="一年级", names=["a","b","c","d","e"])
print(stu_result)
输出:
a b c d e
0 1001 张三 90 88 76
1 1002 李四 98 79 90
2 1003 王五 78 78 0
3 1004 老刘 89 99 67
4 1005 老胡 90 100 87
5 1006 老王 77 88 8
指定哪一列作为索引,可以用列名指定,也可以用整型或整型列表指定
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
# 用列名指定哪一列作为索引
stu_result = pd.read_excel(io, sheet_name="一年级", index_col="学号")
print(stu_result)
# 用整型(类似索引)指定哪一列作为索引,index_col=0代表第一列
stu_result = pd.read_excel(io, sheet_name="一年级", index_col=0)
print(stu_result)
# 用整型列表指定哪几列作为索引,index_col=[0, 3]代表第一列和第四列
stu_result = pd.read_excel(io, sheet_name="一年级", index_col=[0, 3])
print(stu_result)
输出:
姓名 语文 数学 英语
学号
1001 张三 90 88 76
1002 李四 98 79 90
1003 王五 78 78 0
1004 老刘 89 99 67
1005 老胡 90 100 87
1006 老王 77 88 8
姓名 语文 数学 英语
学号
1001 张三 90 88 76
1002 李四 98 79 90
1003 王五 78 78 0
1004 老刘 89 99 67
1005 老胡 90 100 87
1006 老王 77 88 8
姓名 语文 英语
学号 数学
1001 88 张三 90 76
1002 79 李四 98 90
1003 78 王五 78 0
1004 99 老刘 89 67
1005 100 老胡 90 87
1006 88 老王 77 8
usecols 可避免读取全量数据,选择特定数据可以大幅提高效率
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
# 读取第一列,第三列,第四列
stu_result = pd.read_excel(io, sheet_name="一年级", usecols=[0, 2, 3])
print(stu_result)
# 读取第A列,第B列,第C列,第E列
stu_result = pd.read_excel(io, sheet_name="一年级", usecols="A:C, E")
print(stu_result)
输出:
学号 语文 数学
0 1001 90 88
1 1002 98 79
2 1003 78 78
3 1004 89 99
4 1005 90 100
5 1006 77 88
学号 姓名 语文 英语
0 1001 张三 90 76
1 1002 李四 98 90
2 1003 王五 78 0
3 1004 老刘 89 67
4 1005 老胡 90 87
5 1006 老王 77 8
当数据仅包含一列时,squeeze为True时,返回Series,反之返回 DataFrame
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
# 读取数据只有一列的 Sheet4 的工作表, 得到的还是 DataFrame
stu_result = pd.read_excel(io, sheet_name="Sheet4")
print(stu_result)
print(type(stu_result))
# 读取数据只有一列, squeeze为True时, 返回Series
stu_result = pd.read_excel(io, sheet_name="Sheet4", squeeze=True)
print(stu_result)
print(type(stu_result))
输出:
学号
0 aa
1 bb
2 cc
3 dd
4 ee
5 ff
0 aa
1 bb
2 cc
3 dd
4 ee
5 ff
Name: 学号, dtype: object
pandas默认将文本类的数据读取为整型,比如 converters = {‘学号’: str, ‘语文’: float},代表将 ‘学号’ 列数据类型强制规定为字符串,‘语文’ 列强制规定为浮点型。
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
# 读取数据只有一列的 Sheet4 的工作表, 得到的还是 DataFrame
stu_result = pd.read_excel(io, sheet_name="一年级")
print(stu_result["语文"].dtype)
stu_result = pd.read_excel(io, sheet_name="一年级", converters = {'学号': str, '语文': float})
print(stu_result["语文"].dtype)
输出:
int64
float64
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, sheet_name="一年级", skiprows = 3)
print(stu_result)
stu_result = pd.read_excel(io, sheet_name="一年级", skiprows = [1, 3, 4])
print(stu_result)
1003 王五 78 78.1 0
0 1004 老刘 89 99 67
1 1005 老胡 90 100 87
2 1006 老王 77 88 8
学号 姓名 语文 数学 英语
0 1002 李四 98 79 90
1 1005 老胡 90 100 87
2 1006 老王 77 88 8
和 head() 函数是一样的效果,第0行是列名,比如 nrows = 3, 则读取三行数据
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, sheet_name="一年级", nrows = 0)
print(stu_result)
stu_result = pd.read_excel(io, sheet_name="一年级", nrows = 3)
print(stu_result)
stu_result = pd.read_excel(io, sheet_name="一年级")
print(stu_result.head(3))
输出:
Empty DataFrame
Columns: [学号, 姓名, 语文, 数学, 英语]
Index: []
学号 姓名 语文 数学 英语
0 1001 张三 90 88 76
1 1002 李四 98 79 90
2 1003 王五 78 78 0
学号 姓名 语文 数学 英语
0 1001 张三 90 88 76
1 1002 李四 98 79 90
2 1003 王五 78 78 0
比如:skipfooter = 2 代表跳过末尾两行不读取
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, sheet_name="一年级")
print(stu_result)
stu_result = pd.read_excel(io, sheet_name="一年级", skipfooter = 2)
print(stu_result)
输出:
学号 姓名 语文 数学 英语
0 1001 张三 90 88 76
1 1002 李四 98 79 90
2 1003 王五 78 78 0
3 1004 老刘 89 99 67
4 1005 老胡 90 100 87
5 1006 老王 77 88 8
学号 姓名 语文 数学 英语
0 1001 张三 90 88 76
1 1002 李四 98 79 90
2 1003 王五 78 78 0
3 1004 老刘 89 99 67
import pandas as pd
io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, index_col="姓名")
print(stu_result)
# 通过切片把语文,数学,英语三列取出来
part_result = stu_result.iloc[:, 1:]
print(part_result)
print(part_result.mean()) # 求三个学科分别的平均分
print(part_result.mean(axis=1)) # 求每位同学的平均分
print(part_result.max()) # 求三个学科分别的最高分
print(part_result.sum(axis=1)) # 求每位同学的总分
print(part_result.std(axis=1)) # 求每位同学的分数的标准差
print(part_result.var(axis=1)) # 求每位同学的分数的方差(方差越大,偏科越严重)
输出:
学号 语文 数学 英语
姓名
张三 1001 90 88 76
李四 1002 98 79 90
王五 1003 78 78 0
老刘 1004 89 99 67
老胡 1005 90 100 87
老王 1006 77 88 8
语文 数学 英语
姓名
张三 90 88 76
李四 98 79 90
王五 78 78 0
老刘 89 99 67
老胡 90 100 87
老王 77 88 8
语文 87.000000
数学 88.666667
英语 54.666667
dtype: float64
姓名
张三 84.666667
李四 89.000000
王五 52.000000
老刘 85.000000
老胡 92.333333
老王 57.666667
dtype: float64
语文 98
数学 100
英语 90
dtype: int64
姓名
张三 254
李四 267
王五 156
老刘 255
老胡 277
老王 173
dtype: int64
姓名
张三 7.571878
李四 9.539392
王五 45.033321
老刘 16.370706
老胡 6.806859
老王 43.362810
dtype: float64
姓名
张三 57.333333
李四 91.000000
王五 2028.000000
老刘 268.000000
老胡 46.333333
老王 1880.333333
dtype: float64