1. 程式人生 > 實用技巧 >pandas學習之 - excel篇

pandas學習之 - excel篇

一、讀取Excel檔案

  read_excel()  #讀取excel檔案(需要安裝xlrd和openpyxl兩個模組)

  1、方法使用了Python的xlrd模組來讀取Excel2003(.xls)版本的檔案,而Excel2007(.xlsx)及以上版本的使用了xlrd或者 openpyxl模組來讀取的。

  2、在大多數基本的使用案例中,read_excel會讀取Excel檔案通過一個路徑,並且sheet_name會表明需要解析哪一張表格。語法:pd.read_excel("檔案路徑名.xlsx", sheet_name="表格名稱")

  3、為了更方便地讀取同一個檔案的多張表格,ExcelFile

類可用來打包檔案並傳遞給read_excel。因為僅需讀取一次記憶體,所以這種方式讀取一個檔案的多張表格會有效能上的優勢。語法如下

xlsx = pd.ExcelFile("unit.xlsx")
xlsx.sheet_names # 以列表形式返回工作薄中所有工作表的表名 df
= pd.read_excel(xlsx, "sheet1")  # 指定獲取unit.xlsx工作薄中的sheet1工作表

  4、ExcelFile類也能用來作為上下檔案管理器。

with pd.ExcelFile("./unit.xlsx") as xlsx:
    df1 = pd.read_excel(xlsx, "
Sheet1") df2 = pd.reda_excel(xlsx, "Sheet2")

  5、ExcelFile一個主要的用法就是用來解析多張表格的不同引數:

data = {}
# 當Sheet1的格式不同於Sheet2的格式時
with pd.ExcelFile('path_to_file.xls') as xls:
    data['Sheet1'] = pd.read_excel(xls, 'Sheet1', index_col=None, na_values=['NA'])
    data['Sheet2'] = pd.read_excel(xls, 'Sheet2
', index_col=1)

  6、注意如果所有的表格解析同一個引數,那麼這組表格名的列表能輕易地傳遞給read_excel且不會有效能上地損失。

# 使用ExcelFile類
data = {}
with pd.ExcelFile('./unit_data.xls') as xls:
    data['公安局'] = pd.read_excel(xls, '公安局', index_col=None,
                                   na_values=['NA'])
    data['就業局'] = pd.read_excel(xls, '就業局', index_col=None,
                                   na_values=['NA'])

# 等價於read_excel函式
data = pd.read_excel('unit_data.xls', ['公安局', '就業局'],
                     index_col=None, na_values=['NA'])

  7、指定表格

     注意:在read_excel第二個引數是 sheet_name,不要同 ExcelFile.sheet_names搞混淆了

       ExcelFile的屬性 sheet_names提供的是多張表格所生成的列表。

  • sheet_name引數允許指定單張表格或多張表格被讀取。
  •  sheet_name的預設值是0,這表明讀取的是第一張表格
  •  在工作薄裡面,使用字串指向特定的表格名稱。
  •  使用整數指向表格的索引,索引遵守Python的約定從0開始的。
  •  無論是使用一組字串還是整數的列表,返回的都是指定表格的字典。
  •  使用 None值則會返回所有可用表格的一組字典。
# 返回一個DataFrame
pd.read_excel('path_to_file.xls', 'Sheet1', index_col=None, na_values=['NA'])

  使用表格索引:

# 返回一個DataFrame
pd.read_excel("path_to_file.xls", 0, index_col_None, na_values=["NA"])

  使用所有預設值:

# 返回一個DataFrame,預設sheet_name=0
pd.read_excel('path_to_file.xls')

  使用None獲取所有表格:

# 返回DataFrames的字典
pd.read_excel('path_to_file.xls', sheet_name=None)

  使用列表獲取多張表格:

# 返回第一張和第四張紙,作為DataFrames的字典。
pd.read_excel('path_to_file.xls', sheet_name=['Sheet1', 3])

  read_excel能讀取不止一張表格,通過sheet_name能設定為讀取表格名稱的列表,表格位置的列表,還能設定為None來讀取所有表格。多張表格能通過表格索引或表格名稱分別使用整數或字串來指定讀取。


MultiIndex讀取

  read_excel能用MultiIndex讀取多個索引,通過index_col方法來傳遞列的列表和header將行的列表傳遞給MultiIndex的列。無論是index還是columns,如果已經具有序列化的層級名稱,則可以通過指定組成層級的行/列來讀取它們。

# 例如,用MultiIndex讀取沒有名稱的索引:
df = pd.DataFrame({"a":[1,2,3,4], "b":[5,6,7,8]},
                 index=pd.MultiIndex.from_product([["a","b"],["c","d"]]))

df.to_excel("abc.xlsx",sheet_name="temp.xlsx")

df = pd.read_excel("abc.xlsx",index_col=[0,1])

df
# out:
     a  b
a c  1  5
  d  2  6
b c  3  7
  d  4  8

解析特定的列

  常常會有這樣的情況,當用戶想要插入幾列資料到Excel表格裡面作為臨時計算,但是你又不想要讀取這些列的時候,read_excel提供的usecols方法就派上用場了,它讓你可以解析指定的列。

  語法:pd.read_excel("路徑", sheet_name="表名", usecols=[0,2,3])  #表示只顯示0,2,3列,注意點是順序是被忽略的,usecols=[0,1]等價於 [1,0]


解析日期

  當讀取excel檔案的時候,像日期時間的值通常會自動轉換為恰當的dtype(資料型別)。但是如果你有一列字串看起來很像日期(實際上並不是excel裡面的日期格式),那麼你就能使用parse_dates方法來解析這些字串為日期:

  例:pd.read_excel('path_to_file.xls', 'Sheet1', parse_dates=['列索引'])


單元格轉換

  Excel裡面的單元格內容是可以通過converters方法來進行轉換的。例如,把一列轉換為布林值:

  例:pd.read_excel('path_to_file.xls', 'Sheet1', converters={'列索引': bool, "身份證列":str})

  這個方法可以處理缺失值並且能對缺失的資料進行如期的轉換。由於轉換是在單元格之間發生而不是整列,因此不能保證dtype為陣列。例如一列含有缺失值的整數是不能轉換為具有整數dtype的陣列,因為NaN嚴格的被認為是浮點數。你能夠手動地標記缺失資料為恢復整數dtype:

  

def cfun(x):
    return int(x) if x else -1


pd.read_excel('path_to_file.xls', 'Sheet1', converters={'列欄位名': cfun})

  資料型別規範

  作為另一個種轉換器,使用dtype能指定整列地型別,它能讓字典對映列名為資料型別。使用strobject來轉譯不能判斷型別的資料:

  

pd.read_excel('path_to_file.xls', dtype={'列欄位名1': 'int64', '列欄位名2': str})

二、to_excel()  #寫入excel檔案到指定磁碟中

  df.to_excel("path_to_file.xlsx", sheet_name="sheet1")  #第一個引數是excel檔案的名字,第二個是表的名字。

  DataFrame將嘗試以模擬REPL(“讀取-求值-輸出" 迴圈的簡寫)輸出的方式寫入。index_label將代替第一行放置到第二行,你也能放置它到第一行通過在to_excel()裡設定merge_cells選項為False:

  

df.to_excel('path_to_file.xlsx', index_label='label', merge_cells=False)

  為了把DataFrames資料分開寫入Excel檔案的不同表格中,可以使用ExcelWriter方法。

with pd.ExcelWriter('path_to_file.xlsx') as writer:
    df1.to_excel(writer, sheet_name='Sheet1')
    df2.to_excel(writer, sheet_name='Sheet2')

  注意:為了從read_excel內部獲取更多點的效能,Excel儲存所有數值型資料為浮點數。但這會產生意外的情況當讀取資料的時候,如果沒有損失資訊的話(1.0 --> 1),pandas預設的轉換整數為浮點數。你可以通過convert_float=False禁止這種行為,這可能會在效能上有輕微的優化。 


  寫入Excel檔案到記憶體

  Pandas支援寫入Excel檔案到類快取區物件如StringIOBytesIO,使用ExcelWriter方法。

#安全匯入到Python 2.x或3.x
try:
    from io import BytesIO
except ImportError:
    from cStringIO import StringIO as BytesIO

bio = BytesIO()
#通過在ExcelWriter建構函式中設定“引擎”。
writer = pd.ExcelWriter(bio, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')

# 儲存工作簿
writer.save()

# 從頭開始查詢並讀取以將工作簿複製到記憶體中的變數
bio.seek(0)
workbook = bio.read()

Excel寫入引擎 

Pandas選擇Excel寫入有兩種方式:

  1. 使用engine引數
  2. 檔名的擴充套件(通過預設的配置方式指定)  

  為了指定你想要使用的寫入方式,你可以設定引擎的主要引數為to_excelExcelWriter。內建引擎是:  

  • openpyxl: 要求2.4或者更高的版本。
  • xlsxwriter
  • xlwt
# 通過在DataFrame的“ to_excel()”方法中設定“引擎”。
df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', engine='xlsxwriter')

#通過在ExcelWriter建構函式中設定“引擎”。
writer = pd.ExcelWriter('path_to_file.xlsx', engine='xlsxwriter')

# 或通過pandas配置。
from pandas import options                                     # noqa: E402
options.io.excel.xlsx.writer = 'xlsxwriter'

df.to_excel('path_to_file.xlsx', sheet_name='Sheet1')

樣式

通過pandas產生的Excel工作表的樣式可以使用DataFrameto_excel方法的以下引數進行修改。

  • float_format:格式化字串用於浮點數(預設是None)。
  • freeze_panes:兩個整數的元組,表示要固化的最底行和最右列。這些引數中的每個都是以1為底,因此(1, 1)將固化第一行和第一列(預設是None)。

使用XlsxWriter引擎提供的多種方法來修改用to_excel方法建立的Excel工作表的樣式。你能在XlsxWriter文件裡面找到絕佳的例子:https://xlsxwriter.readthedocs.io/working_with_pandas.html