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


pd.merge(left, right, on=[], how="inner") # 可以指定按照兩組數據的共同鍵值對合並或者左右各自

    參數left:表示左數集

    參數right:表示右數集

    參數on:表示要加入的列(名稱)。 必須在左右DataFrame對象中都找到。

    參數left_on,right_on:當兩個表里沒有完全一致的列名,但是有信息一致的列,需要比對時只需要傳入兩列的列名即可比對。

    參數how:表示集合方式,以何種方式連接,有四個參數可選,left表示左交集,right表示右交集,inner表示共有數據,outer表示左右交集有沒有都全部顯示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM