飞道的博客

Python如何使用pandas读取excel(参数详解)

1059人阅读  评论(0)

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 , 否则会报错)

io【excel 的存储路径】

建议使用英文路径以及英文命名方式

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

sheet_name【要读取的工作表名称】

可以是整数、列表名,也可以是上述组成的列表。

  • sheet_name = 整数(类似索引,比如sheet_name = 1代表第2个工作表,默认等于0)
import pandas as pd

io = r"C:\Users\Administrator\Desktop\学习成绩统计表.xlsx"
stu_result = pd.read_excel(io, sheet_name = 1)
print(stu_result)
  • sheet_name = 列表名(目标 Sheet 的名称,如果没有重命名的话,默认就是 SheetN ,N指的是第几个 Sheet)
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)])

header【用哪一行作为 列名】

  • 默认为0,代表第一行作为列名,比如设置为2则代表第三行作为列名,且前面的两行就不会读取了
  • 如果设置为 [0, 2],则代表第一行和第三行作为列名,且中间的第二行就不会读取了
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

names【自定义列名】

一般适用于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

index_col【用作索引的列】

指定哪一列作为索引,可以用列名指定,也可以用整型或整型列表指定

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【要读取哪些列】

usecols 可避免读取全量数据,选择特定数据可以大幅提高效率

  • 可以使用整型,从0开始,如[0,2,3]
  • 也可以使用 excel 传统的列名"A"、"B"等字母,如 “A: C, E” =“A, B, C, E”(A: C代表A,B,C)
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【单列数据是否转Series】

当数据仅包含一列时,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

<class 'pandas.core.frame.DataFrame'>

0    aa
1    bb
2    cc
3    dd
4    ee
5    ff
Name: 学号, dtype: object

<class 'pandas.core.series.Series'>

converters【强制规定列数据类型】

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

skiprows【跳过指定行】

  • 可以 skiprows = n,代表跳过前n行,首行(即列名)也会被跳过
  • 也可以通过列表指定跳过的行,如 skiprows = [1, 3, 4],跳过第2,4,5行(索引从0开始)
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

nrows【指定读取的行数】

和 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【跳过末尾n行】

比如: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

转载:https://blog.csdn.net/m0_46076716/article/details/107596725
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场