python--pandas读取excel

对excel文件的读取是数据分析中常见的,在python中,pandas库的read_excel方法能够读取excel文件,包括xls和xlsx格式。
本文介绍使用pandas读取excel以及读取过程中一些常见的问题。

环境

Excel文件的格式为xlsxlsx,pandas读取excel文件需要安装依赖库xlrdopenpyxl

!注意:当xlrd>=2.0时,只支持xls格式,不再支持xlsx。

  • python3.9
  • win10 64bit
  • pandas==1.2.1
  • xlrd==2.0.1
  • openpyxl==3.0.7

读取xls

read_excel方法读取xls格式文件,自动使用xlrd引擎。指定io参数为文件路径,文件路径可以是绝对路径或者相对路径。

import pandas as pd
pd.set_option('display.notebook_repr_html',False)
# 读取xls(绝对路径)
pd.read_excel(io=r'E:\blog\Python\pandas\excel\data.xls')
       date  name  count  socre    sum
0  2017_1_1   mpg     15  1.506  1.330
1  2017_1_2   asd     18  1.533  1.359
2  2017_1_3  puck     20  1.537  1.365
3  2017_1_4    #N     24  1.507  1.334
4  2017_1_5   NaN     27  1.498  1.325
5  2017_1_6  some     30  1.506  1.329

文件路径字符串前面加r是为了防止字符串中的\转义

# 读取xls(相对路径)
pd.read_excel(io='./data.xls')
       date  name  count  socre    sum
0  2017_1_1   mpg     15  1.506  1.330
1  2017_1_2   asd     18  1.533  1.359
2  2017_1_3  puck     20  1.537  1.365
3  2017_1_4    #N     24  1.507  1.334
4  2017_1_5   NaN     27  1.498  1.325
5  2017_1_6  some     30  1.506  1.329

读取xlsx

read_excel方法读取xlsx格式文件,自动使用openpyxl引擎。同样,可以使用绝对或相对路径读取。

# 读取xlsx
pd.read_excel(io='./data.xlsx')
       date  name  count  socre    sum
0  2017_1_1   mpg     15  1.506  1.330
1  2017_1_2   asd     18  1.533  1.359
2  2017_1_3  puck     20  1.537  1.365
3  2017_1_4    #N     24  1.507  1.334
4  2017_1_5   NaN     27  1.498  1.325
5  2017_1_6  some     30  1.506  1.329

设置sheet

设置sheet_name参数,可以指定读取excel的sheet。可以根据sheet的名字或者位置设置参数。

sheet_name默认值是0,表示读取第一个sheet。

# 读取xlsx(第二个sheet)(设置sheet位置)
pd.read_excel(io='./data.xlsx',sheet_name=1)
       date    kind  sum   coef  value
0  2019_1_1  pandas  100  2.506  1.530
1  2019_1_2     cat  200  2.533  1.359
2  2019_1_3     dog  300  2.560  1.188
3  2019_1_4    fish  400  2.587  1.017
4  2019_1_5     sky  500  2.614  0.846
5  2019_1_6     git  600  2.641  0.675
# 读取xlsx(第二个sheet)(设置sheet名字)
pd.read_excel(io='./data.xlsx',sheet_name='demo2')
       date    kind  sum   coef  value
0  2019_1_1  pandas  100  2.506  1.530
1  2019_1_2     cat  200  2.533  1.359
2  2019_1_3     dog  300  2.560  1.188
3  2019_1_4    fish  400  2.587  1.017
4  2019_1_5     sky  500  2.614  0.846
5  2019_1_6     git  600  2.641  0.675

设置sheet_name=None,可以读取全部的sheet,返回字典,key为sheet名字,value为sheet表内容。

# 读取xlsx(全部sheet)
pd.read_excel(io='./data.xlsx',sheet_name=None)
{'demo':        date  name  count  socre    sum
 0  2017_1_1   mpg     15  1.506  1.330
 1  2017_1_2   asd     18  1.533  1.359
 2  2017_1_3  puck     20  1.537  1.365
 3  2017_1_4    #N     24  1.507  1.334
 4  2017_1_5   NaN     27  1.498  1.325
 5  2017_1_6  some     30  1.506  1.329,
 'demo2':        date    kind  sum   coef  value
 0  2019_1_1  pandas  100  2.506  1.530
 1  2019_1_2     cat  200  2.533  1.359
 2  2019_1_3     dog  300  2.560  1.188
 3  2019_1_4    fish  400  2.587  1.017
 4  2019_1_5     sky  500  2.614  0.846
 5  2019_1_6     git  600  2.641  0.675}

设置列标签

设置header参数,可以指定目标行的数据为列标签。

header默认值是0,表示第0行为列标签。
设置header为i(整数),表示设置i行为列标签,i行之前的数据会被舍弃。

demo3.png

可以看出表格有标题,有列名,如果不设置header,读出来的表格为

# 读取xlsx
pd.read_excel(io='./title.xlsx')
                 title Unnamed: 1 Unnamed: 2
0                   id     value1     value2
1  1900-01-01 00:00:00         23         56
2  1900-01-02 00:00:00         33         45
3  1900-01-03 00:00:00         43         34
4  1900-01-04 00:00:00         53         23

如果要舍弃第一行标题,设置header=1即可。

# 读取xlsx(指定第二行为列标签)
pd.read_excel(io='./title.xlsx',header=1)
          id  value1  value2
0 1900-01-01      23      56
1 1900-01-02      33      45
2 1900-01-03      43      34
3 1900-01-04      53      23

时间列解析

在读取excel时,对于数据中有时间列的,一般操作是要把时间列解析成时间格式。

# 读取
df=pd.read_excel(io='./data.xlsx')
# 查看每列数据类型
df.dtypes
date      object
name      object
count      int64
socre    float64
sum      float64
dtype: object

dtypes属性查看每列的数据类型,发现date列类型为object,并未解析成时间格式,其时间格式为%Y_%m_%d,pandas无法自动识别。

两步完成时间列解析:

  1. 设置parse_dates参数,指定需要解析的列;
  2. 设置date_parser参数,指定解析器。
# 解析时间列
df=pd.read_excel(io='./data.xls',
                 parse_dates=[0],
                 date_parser=lambda x:pd.to_datetime(x,format='%Y_%m_%d'))
df
        date  name  count  socre    sum
0 2017-01-01   mpg     15  1.506  1.330
1 2017-01-02   asd     18  1.533  1.359
2 2017-01-03  puck     20  1.537  1.365
3 2017-01-04    #N     24  1.507  1.334
4 2017-01-05   NaN     27  1.498  1.325
5 2017-01-06  some     30  1.506  1.329
# 查看每列数据类型
df.dtypes
date     datetime64[ns]
name             object
count             int64
socre           float64
sum             float64
dtype: object

如果需要把解析的时间列设置为索引,需要设置index_col参数,表示索引列。

# 解析时间列,并设置为索引
df=pd.read_excel(io='./data.xls',
                 index_col=[0],
                 parse_dates=[0],
                 date_parser=lambda x:pd.to_datetime(x,format='%Y_%m_%d'))
df
            name  count  socre    sum
date                                 
2017-01-01   mpg     15  1.506  1.330
2017-01-02   asd     18  1.533  1.359
2017-01-03  puck     20  1.537  1.365
2017-01-04    #N     24  1.507  1.334
2017-01-05   NaN     27  1.498  1.325
2017-01-06  some     30  1.506  1.329

读取部分列

设置usecols参数,选择部分列进行读取,可以加快读取速度。可以根据需求灵活设置usecols参数,来选择多列。

usecols默认None,表示全部读取全部列

  • 字符串"A,C:D":表示选择excel字母列的A列,和C到D列;
# 选择部分列读取(字符串形式)
pd.read_excel(io='./data.xlsx',usecols="A,C:D")
       date  count  socre
0  2017_1_1     15  1.506
1  2017_1_2     18  1.533
2  2017_1_3     20  1.537
3  2017_1_4     24  1.507
4  2017_1_5     27  1.498
5  2017_1_6     30  1.506
  • 字符列表["date","name"]:表示选择数据的date列和name列;
# 选择部分列读取(字符列表形式)
pd.read_excel(io='./data.xlsx',usecols=['date','name'])
       date  name
0  2017_1_1   mpg
1  2017_1_2   asd
2  2017_1_3  puck
3  2017_1_4    #N
4  2017_1_5   NaN
5  2017_1_6  some
  • 整数列表[0,2]:表示选择数据的0列和2列;
# 选择部分列读取(整数列表形式)
pd.read_excel(io='./data.xlsx',usecols=[0,2])
       date  count
0  2017_1_1     15
1  2017_1_2     18
2  2017_1_3     20
3  2017_1_4     24
4  2017_1_5     27
5  2017_1_6     30
  • 函数lambda x:x.endswith("e"):表示选择以字母e结尾的所有列
# 选择部分列读取(函数形式)
pd.read_excel(io='./data.xlsx',usecols=lambda x:x.endswith("e"))
       date  name  socre
0  2017_1_1   mpg  1.506
1  2017_1_2   asd  1.533
2  2017_1_3  puck  1.537
3  2017_1_4    #N  1.507
4  2017_1_5   NaN  1.498
5  2017_1_6  some  1.506

读取部分行

设置参数nrows=n,可以读取数据的前n行。

nrows默认None,表示全部读取全部行

# 选择前3行读取
pd.read_excel(io='./data.xlsx',nrows=4)
       date  name  count  socre    sum
0  2017_1_1   mpg     15  1.506  1.330
1  2017_1_2   asd     18  1.533  1.359
2  2017_1_3  puck     20  1.537  1.365
3  2017_1_4    #N     24  1.507  1.334

设置skiprows参数,可以跳过部分行不读取。

skiprows默认None,表示不跳过行

# 跳过1,3行不读取
pd.read_excel(io='./data.xlsx',skiprows=[1,3])
       date  name  count  socre    sum
0  2017_1_2   asd     18  1.533  1.359
1  2017_1_4    #N     24  1.507  1.334
2  2017_1_5   NaN     27  1.498  1.325
3  2017_1_6  some     30  1.506  1.329

可以设置skiprows参数为匿名函数,更加灵活的跳过部分行不读取。

# 跳过部分行不读取(行索引包含[4,5])
pd.read_excel(io='./data.xlsx',skiprows=lambda x:x in [4,5])
       date  name  count  socre    sum
0  2017_1_1   mpg     15  1.506  1.330
1  2017_1_2   asd     18  1.533  1.359
2  2017_1_3  puck     20  1.537  1.365
3  2017_1_6  some     30  1.506  1.329

缺失值处理

read_excel会自动把缺失值标记为NaN,但实际的情况千变万化,例如实际中缺失值可能用#N,##等各种异常符号表示,
这时候设置na_values参数,可以填充这些异常符号为缺失值。

# 填充缺失值
pd.read_excel(io='./data.xlsx',na_values='#N')
       date  name  count  socre    sum
0  2017_1_1   mpg     15  1.506  1.330
1  2017_1_2   asd     18  1.533  1.359
2  2017_1_3  puck     20  1.537  1.365
3  2017_1_4   NaN     24  1.507  1.334
4  2017_1_5   NaN     27  1.498  1.325
5  2017_1_6  some     30  1.506  1.329

更多使用细节参考:read_excel

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容