pandas 讀寫(xiě) Excel

pandas 讀寫(xiě) Excel绣否,可以用于將重復(fù)的數(shù)據(jù)加工工作交給 pandas泞当,節(jié)省手工勞動(dòng)梧却,使用起來(lái)也比較方便奇颠,但輸出的格式并不太美觀。本文介紹 read_excel()to_excel() 的部分細(xì)節(jié)放航,同時(shí)探討如何輸出一個(gè)較為美觀的 Excel 工作表烈拒。

pandas 讀取 Excel 文件

語(yǔ)法

DataFrame.read_excel() 的語(yǔ)法:

pandas.read_excel(io, 
                  sheet_name=0, 
                  header=0, 
                  names=None, 
                  index_col=None, 
                  parse_cols=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)

參數(shù)和返回值的說(shuō)明請(qǐng)參考 pandas 文檔

最簡(jiǎn)單的用法广鳍,只需要指定文件名參數(shù)荆几,支持 xls 文和 xlsx 文件格式,函數(shù)的返回值為 DataFrame 類(lèi)型的對(duì)象赊时。比如讀取 D 盤(pán)根目錄下的 source.xlsx 文件:

import pandas as pd
df1 = pd.read_excel(r'D:/source.xlsx)

如果想讀取 py 文件所在目錄下的某個(gè) Excel 文件吨铸,可以參考下面的代碼:

import pandas as pd 
import os

# get path of current directory
curr_path = os.path.dirname(os.path.abspath(__file__))
fname = os.path.join(curr_path, 'users.xlsx')
df2 = pd.read_excel(fname)

指定要讀取的工作表

對(duì)于有多個(gè)工作表的 Excel 文件,pandas 默認(rèn)讀取第一個(gè)工作表( sheet_name=0 )祖秒。通過(guò)如下兩種方法可以指定要讀取的工作表:

# 方法一:通過(guò) index 指定工作表
df3 = pd.read_excel(file_name, sheet_name=0)

# 方法二:指定工作表名稱(chēng)
df4 = pd.read_excel(file_name, sheet_name='Sheet1')

導(dǎo)入指定列

如果只想導(dǎo)入指定的列诞吱,通過(guò) usecols 參數(shù)舟奠,比如想導(dǎo)入 A:DH 這 4 列,有如下兩種方法:

df6 = pd.read_excel(r'D:/source.xlsx', usecols='A:D,H')

# 或者
df6 = pd.read_excel(r'D:/source.xlsx', usecols=[0,1,2,3,7])

指定表頭

默認(rèn)情況下房维,pandas 假定第一行為表頭 (header)鸭栖,如果 Excel 不是從第一行開(kāi)始,header 參數(shù)用于指定將哪一行作為表頭握巢,表頭在 DataFrame 中變成列索引 (column index) ,header 參數(shù)從 0 開(kāi)始松却,比如第二行作為 header暴浦,則:

df = pd.read_excel(file_name, header=1)

pandas 寫(xiě)入 Excel

語(yǔ)法

DataFrame.to_excel() 的語(yǔ)法:

DataFrame.to_excel(excel_writer, 
                   sheet_name='Sheet1', 
                   na_rep='', 
                   float_format=None, 
                   columns=None, 
                   header=True, 
                   index=True, 
                   index_label=None, 
                   startrow=0, startcol=0, 
                   engine=None, 
                   merge_cells=True, 
                   encoding=None, 
                   inf_rep='inf', 
                   verbose=True, 
                   freeze_panes=None)

參數(shù)和返回值的說(shuō)明請(qǐng)參考 pandas 文檔

數(shù)據(jù)寫(xiě)入 Excel晓锻,需要首先安裝一個(gè) engine歌焦,由 engine 負(fù)責(zé)將數(shù)據(jù)寫(xiě)入 Excel,pandas 使用 openpyx 或 xlsxwriter 作為寫(xiě)入引擎砚哆。

要將單一對(duì)象寫(xiě)入 Excel独撇,只需要指定 file name 即可:

import pandas as pd
import os

path = os.path.dirname(os.path.abspath(__file__))
source_file = os.path.join(path, 'source.xlsx')
output_file = os.path.join(path, 'output.xlsx')

df = pd.read_excel(source_file, sheet_name=0)
df.to_excel(output_file)

如果 output.xlsx 文件已經(jīng)存在,to_excel()先刪除 output.xlsx 文件躁锁,然后重新生成一個(gè)新的文件纷铣,并且默認(rèn)添加一個(gè)索引列,索引為從 0 到 n 的整數(shù)战转。

不使用索引

導(dǎo)出 Excel搜立,一般不需要索引,將 index 參數(shù)設(shè)為 False 即可:

df.to_excel(output_file, index=False)

多工作表導(dǎo)出

導(dǎo)出多個(gè)工作表需要明確給出 excel writer engine槐秧,然后調(diào)用 DataFrame.to_excel()方法:

import pandas as pd
import os

path = os.path.dirname(os.path.abspath(__file__))
source_file = os.path.join(path, 'source.xlsx')
output_file = os.path.join(path, 'output.xlsx')

df1 = pd.read_excel(source_file, sheet_name=0)
df2 = pd.read_excel(source_file, sheet_name=0, usecols='A:D,H')

with pd.ExcelWriter(output_file, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, sheet_name='Sheet1', index=False)
    df2.to_excel(writer, sheet_name='Sheet2', index=False)

工作表美化

pandas 導(dǎo)出的工作表并不美觀啄踊,如果想對(duì)工作表進(jìn)行美化的話(huà),可在 to_excel()方法之后刁标,通過(guò)Excel writer engine 的格式設(shè)置的功能來(lái)設(shè)置格式颠通。根據(jù)測(cè)試, to_excel() 因?yàn)橄葎h除文件膀懈,所以也不能使用 Template 來(lái)保存預(yù)定義格式顿锰。所以如果需要導(dǎo)出有格式的 Excel 文件,比如作為報(bào)表輸出启搂,可考慮 Template + Excel writer engine 手工代碼的方式撵儿。

Creating Advanced Excel Workbooks with Python 這篇文章講到了一個(gè)方法,使用 xlsxwriter 的 add_table() 方法狐血,在 Excel 中創(chuàng)建一個(gè) Table 對(duì)象(中文經(jīng)常被稱(chēng)為智能表格)淀歇,然后選擇一個(gè)預(yù)定義的格式。我對(duì)代碼進(jìn)行了加工匈织,使之更具普適性:

import pandas as pd
import os

def get_col_widths(dataframe):    
    return [max([len(str(s))  for s in dataframe[col].values] 
            + [len(col)]) for col in dataframe.columns]

def fmt_excel(writer, sheetname, dataframe):
    # Get the workbook and the summary sheet so we can add the formatting
    workbook = writer.book
    worksheet = writer.sheets[sheetname]
    col_count = dataframe.shape[1]
    row_count = dataframe.shape[0]

    col_names = []
    for i in range(0, col_count):
        col_names.append({'header': dataframe.columns[i]})

    # rng = 'A1:H{}'.format(row_count + 1)
    worksheet.add_table(0, 0, row_count,col_count-1, {
        'columns': col_names,
        'style': 'Table Style Medium 20'
    })

    # auto column size
    col_widths = get_col_widths(dataframe)
    for i, width in enumerate(col_widths):
        worksheet.set_column(i, i, width)

path = os.path.dirname(os.path.abspath(__file__))
source_file = os.path.join(path, 'source.xlsx')
output_file = os.path.join(path, 'output.xlsx')

df = pd.read_excel(source_file, sheet_name=0)

writer = pd.ExcelWriter(output_file, engine='xlsxwriter')
df.to_excel(writer, 'Sheet1', index=False)

fmt_excel(writer, 'Sheet1', df)
writer.save()

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浪默,一起剝皮案震驚了整個(gè)濱河市牡直,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纳决,老刑警劉巖碰逸,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異阔加,居然都是意外死亡饵史,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)胜榔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胳喷,“玉大人,你說(shuō)我怎么就攤上這事夭织】月叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵尊惰,是天一觀的道長(zhǎng)讲竿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)弄屡,這世上最難降的妖魔是什么题禀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮膀捷,結(jié)果婚禮上投剥,老公的妹妹穿的比我還像新娘。我一直安慰自己担孔,他們只是感情好江锨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著糕篇,像睡著了一般啄育。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拌消,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天挑豌,我揣著相機(jī)與錄音,去河邊找鬼墩崩。 笑死氓英,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹦筹。 我是一名探鬼主播铝阐,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铐拐!你這毒婦竟也來(lái)了徘键?” 一聲冷哼從身側(cè)響起练对,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吹害,沒(méi)想到半個(gè)月后螟凭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡它呀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年螺男,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵穿。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡下隧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出政恍,到底是詐尸還是另有隱情,我是刑警寧澤达传,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布篙耗,位于F島的核電站,受9級(jí)特大地震影響宪赶,放射性物質(zhì)發(fā)生泄漏宗弯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一搂妻、第九天 我趴在偏房一處隱蔽的房頂上張望蒙保。 院中可真熱鬧,春花似錦欲主、人聲如沸邓厕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)详恼。三九已至,卻和暖如春引几,著一層夾襖步出監(jiān)牢的瞬間昧互,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工伟桅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敞掘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓楣铁,卻偏偏與公主長(zhǎng)得像玖雁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盖腕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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