python--pandas讀取excel

對excel文件的讀取是數(shù)據(jù)分析中常見的螺捐,在python中缎讼,pandas庫的read_excel方法能夠讀取excel文件专执,包括xls和xlsx格式肩祥。
本文介紹使用pandas讀取excel以及讀取過程中一些常見的問題飞几。

環(huán)境

Excel文件的格式為xlsxlsx砚哆,pandas讀取excel文件需要安裝依賴庫xlrdopenpyxl

!注意:當(dāng)xlrd>=2.0時(shí)屑墨,只支持xls格式躁锁,不再支持xlsx。

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

讀取xls

read_excel方法讀取xls格式文件卵史,自動使用xlrd引擎战转。指定io參數(shù)為文件路徑,文件路徑可以是絕對路徑或者相對路徑以躯。

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是為了防止字符串中的\轉(zhuǎn)義

# 讀取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

設(shè)置sheet

設(shè)置sheet_name參數(shù),可以指定讀取excel的sheet址晕“蛐福可以根據(jù)sheet的名字或者位置設(shè)置參數(shù)。

sheet_name默認(rèn)值是0谨垃,表示讀取第一個(gè)sheet启搂。

# 讀取xlsx(第二個(gè)sheet)(設(shè)置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(第二個(gè)sheet)(設(shè)置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

設(shè)置sheet_name=None,可以讀取全部的sheet刘陶,返回字典狐血,key為sheet名字,value為sheet表內(nèi)容易核。

# 讀取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}

設(shè)置列標(biāo)簽

設(shè)置header參數(shù),可以指定目標(biāo)行的數(shù)據(jù)為列標(biāo)簽浪默。

header默認(rèn)值是0牡直,表示第0行為列標(biāo)簽缀匕。
設(shè)置header為i(整數(shù)),表示設(shè)置i行為列標(biāo)簽碰逸,i行之前的數(shù)據(jù)會被舍棄乡小。

demo3.png

可以看出表格有標(biāo)題,有列名饵史,如果不設(shè)置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

如果要舍棄第一行標(biāo)題,設(shè)置header=1即可胳喷。

# 讀取xlsx(指定第二行為列標(biāo)簽)
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

時(shí)間列解析

在讀取excel時(shí)湃番,對于數(shù)據(jù)中有時(shí)間列的,一般操作是要把時(shí)間列解析成時(shí)間格式吭露。

# 讀取
df=pd.read_excel(io='./data.xlsx')
# 查看每列數(shù)據(jù)類型
df.dtypes
date      object
name      object
count      int64
socre    float64
sum      float64
dtype: object

dtypes屬性查看每列的數(shù)據(jù)類型吠撮,發(fā)現(xiàn)date列類型為object,并未解析成時(shí)間格式讲竿,其時(shí)間格式為%Y_%m_%d,pandas無法自動識別泥兰。

兩步完成時(shí)間列解析:

  1. 設(shè)置parse_dates參數(shù),指定需要解析的列题禀;
  2. 設(shè)置date_parser參數(shù)鞋诗,指定解析器。
# 解析時(shí)間列
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
# 查看每列數(shù)據(jù)類型
df.dtypes
date     datetime64[ns]
name             object
count             int64
socre           float64
sum             float64
dtype: object

如果需要把解析的時(shí)間列設(shè)置為索引迈嘹,需要設(shè)置index_col參數(shù)削彬,表示索引列。

# 解析時(shí)間列江锨,并設(shè)置為索引
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

讀取部分列

設(shè)置usecols參數(shù)吃警,選擇部分列進(jìn)行讀取,可以加快讀取速度啄育∽眯模可以根據(jù)需求靈活設(shè)置usecols參數(shù),來選擇多列挑豌。

usecols默認(rèn)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"]:表示選擇數(shù)據(jù)的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
  • 整數(shù)列表[0,2]:表示選擇數(shù)據(jù)的0列和2列址貌;
# 選擇部分列讀取(整數(shù)列表形式)
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
  • 函數(shù)lambda x:x.endswith("e"):表示選擇以字母e結(jié)尾的所有列
# 選擇部分列讀取(函數(shù)形式)
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

讀取部分行

設(shè)置參數(shù)nrows=n练对,可以讀取數(shù)據(jù)的前n行遍蟋。

nrows默認(rèn)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

設(shè)置skiprows參數(shù)螟凭,可以跳過部分行不讀取虚青。

skiprows默認(rèn)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

可以設(shè)置skiprows參數(shù)為匿名函數(shù)棒厘,更加靈活的跳過部分行不讀取。

# 跳過部分行不讀认滤怼(行索引包含[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會自動把缺失值標(biāo)記為NaN奢人,但實(shí)際的情況千變?nèi)f化,例如實(shí)際中缺失值可能用#N,##等各種異常符號表示汪拥,
這時(shí)候設(shè)置na_values參數(shù)达传,可以填充這些異常符號為缺失值。

# 填充缺失值
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

更多使用細(xì)節(jié)參考:read_excel

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迫筑,一起剝皮案震驚了整個(gè)濱河市宪赶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脯燃,老刑警劉巖搂妻,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辕棚,居然都是意外死亡欲主,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門逝嚎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扁瓢,“玉大人,你說我怎么就攤上這事补君∫福” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵挽铁,是天一觀的道長伟桅。 經(jīng)常有香客問我,道長叽掘,這世上最難降的妖魔是什么楣铁? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮更扁,結(jié)果婚禮上盖腕,老公的妹妹穿的比我還像新娘赫冬。我一直安慰自己,他們只是感情好赊堪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布面殖。 她就那樣靜靜地躺著,像睡著了一般哭廉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上相叁,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天遵绰,我揣著相機(jī)與錄音,去河邊找鬼增淹。 笑死椿访,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虑润。 我是一名探鬼主播成玫,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拳喻!你這毒婦竟也來了哭当?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冗澈,失蹤者是張志新(化名)和其女友劉穎钦勘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亚亲,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彻采,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捌归。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肛响。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惜索,靈堂內(nèi)的尸體忽然破棺而出特笋,到底是詐尸還是另有隱情,我是刑警寧澤门扇,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布雹有,位于F島的核電站,受9級特大地震影響臼寄,放射性物質(zhì)發(fā)生泄漏霸奕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一吉拳、第九天 我趴在偏房一處隱蔽的房頂上張望质帅。 院中可真熱鬧,春花似錦、人聲如沸煤惩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魄揉。三九已至剪侮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洛退,已是汗流浹背瓣俯。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兵怯,地道東北人彩匕。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像媒区,于是被迫代替她去往敵國和親驼仪。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容