兩個(gè)使用 Pandas 讀取異常數(shù)據(jù)結(jié)構(gòu) Excel 的方法,拿走不謝!
通常情況下,我們使用 Pandas 來讀取 Excel 數(shù)據(jù),可以很方便的把數(shù)據(jù)轉(zhuǎn)化為 DataFrame 類型。但是現(xiàn)實(shí)情況往往很骨干,當(dāng)我們遇到結(jié)構(gòu)不是特別良好的 Excel 的時(shí)候,常規(guī)的 Pandas 讀取操作就不怎么好用了,今天我們就來看兩個(gè)讀取非常規(guī)結(jié)構(gòu) Excel 數(shù)據(jù)的例子

本文使用的測(cè)試 Excel 內(nèi)容如下


文末可以獲取到該文件
指定列讀取
一般情況下,我們使用 read_excel 函數(shù)讀取 Excel 數(shù)據(jù)時(shí),都是默認(rèn)從第 A 列開始讀取的,但是對(duì)于某些 Excel 數(shù)據(jù),往往不是從第 A 列就有數(shù)據(jù)的,此時(shí)我們需要參數(shù) usecols 來進(jìn)行規(guī)避處理
比如上面的 Excel 數(shù)據(jù),如果我們直接使用 read_excel(src_file) 讀取,會(huì)得到如下結(jié)果

我們得到了很多未命名的列以及很多我們根本不需要的列數(shù)據(jù)
此時(shí)我們可以通過 usecols 來指定讀取哪些列數(shù)據(jù)
from?pathlib?import?Path
src_file?=?Path.cwd()?/??'shipping_tables.xlsx'
df?=?pd.read_excel(src_file,?header=1,?usecols='B:F')

可以看到生成的 DataFrame 中只包含我們需要的數(shù)據(jù),特意排除了 notes 列和 date 字段
usecols 可以接受一個(gè) Excel 列的范圍,例如 B:F 并僅讀取這些列,header 參數(shù)需要一個(gè)定義標(biāo)題列的整數(shù),它的索引從0開始,所以我們傳入 1,也就是 Excel 中的第 2 行
我們也可以將列定義為數(shù)字列表
df?=?pd.read_excel(src_file,?header=1,?usecols=[1,2,3,4,5])
也可以通過列名稱來選擇所需的列數(shù)據(jù)
df?=?pd.read_excel(
????src_file,
????header=1,
????usecols=['item_type',?'order?id',?'order?date',?'state',?'priority'])
這種做法在列的順序改變但是列的名稱不變的時(shí)候非常有用
最后,usecols 還可以接受一個(gè)可調(diào)用的函數(shù)
def?column_check(x):
????if?'unnamed'?in?x.lower():
????????return?False
????if?'priority'?in?x.lower():
????????return?False
????if?'order'?in?x.lower():
????????return?True
????return?True
df?=?pd.read_excel(src_file,?header=1,?usecols=column_check)
該函數(shù)將按名稱解析每一列,并且必須為每一列返回 True 或 False
當(dāng)然也可以使用 lambda 表達(dá)式
cols_to_use?=?['item_type',?'order?id',?'order?date',?'state',?'priority']
df?=?pd.read_excel(src_file,
???????????????????header=1,
???????????????????usecols=lambda?x:?x.lower()?in?cols_to_use)
范圍和表格
在某些情況下,Excel 中的數(shù)據(jù)可能會(huì)更加不確定,在我們的 Excel 數(shù)據(jù)中,我們有一個(gè)想要讀取的名為 ship_cost 的表,這該怎么獲取呢

在這種情況下,我們可以直接使用 openpyxl 來解析 Excel 文件并將數(shù)據(jù)轉(zhuǎn)換為 pandas DataFrame
以下是使用 openpyxl(安裝后)讀取 Excel 文件的方法:
from?openpyxl?import?load_workbook
import?pandas?as?pd
from?pathlib?import?Path
src_file?=?src_file?=?Path.cwd()?/?'shipping_tables.xlsx'
wb?=?load_workbook(filename?=?src_file)
查看所有的 sheet 頁,獲取某個(gè) sheet 頁,獲取 Excel 范圍數(shù)據(jù)
wb.sheetnames
sheet?=?wb['shipping_rates']
lookup_table?=?sheet.tables['ship_cost']
lookup_table.ref

現(xiàn)在我們以及知道要加載的數(shù)據(jù)范圍了, 接下來就是將該范圍轉(zhuǎn)換為 Pandas DataFrame
#?獲取數(shù)據(jù)范圍
data?=?sheet[lookup_table.ref]
rows_list?=?[]
#?循環(huán)獲取數(shù)據(jù)
for?row?in?data:
????cols?=?[]
????for?col?in?row:
????????cols.append(col.value)
????rows_list.append(cols)
df?=?pd.DataFrame(data=rows_list[1:],?index=None,?columns=rows_list[0])

這樣我們就獲取到了干凈的表數(shù)據(jù)了
好了,今天的兩個(gè)小知識(shí)點(diǎn)就分享到這里了,我們下次再見!
需要完整代碼和測(cè)試 Excel 數(shù)據(jù),點(diǎn)點(diǎn)在看,微信私聊獲??!
END
推薦閱讀
牛逼!Python常用數(shù)據(jù)類型的基本操作(長文系列第①篇)
牛逼!Python的判斷、循環(huán)和各種表達(dá)式(長文系列第②篇)
Ps:從小程序直接獲取下載如下福利
