簡(jiǎn)單好用!Pandas 讀取異常數(shù)據(jù)結(jié)構(gòu) Excel!
↑ 關(guān)注 + 星標(biāo) ,每天學(xué)Python新技能
后臺(tái)回復(fù)【大禮包】送你Python自學(xué)大禮包
大家好,我是龍哥!
通常情況下,我們使用 Pandas 來(lái)讀取 Excel 數(shù)據(jù),可以很方便的把數(shù)據(jù)轉(zhuǎn)化為 DataFrame 類型。但是現(xiàn)實(shí)情況往往很骨干,當(dāng)我們遇到結(jié)構(gòu)不是特別良好的 Excel 的時(shí)候,常規(guī)的 Pandas 讀取操作就不怎么好用了,今天我們就來(lái)看兩個(gè)讀取非常規(guī)結(jié)構(gòu) Excel 數(shù)據(jù)的例子

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


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

我們得到了很多未命名的列以及很多我們根本不需要的列數(shù)據(jù)
此時(shí)我們可以通過(guò) usecols 來(lái)指定讀取哪些列數(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開(kāi)始,所以我們傳入 1,也就是 Excel 中的第 2 行
我們也可以將列定義為數(shù)字列表
df = pd.read_excel(src_file, header=1, usecols=[1,2,3,4,5])
也可以通過(guò)列名稱來(lái)選擇所需的列數(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 來(lái)解析 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 頁(yè),獲取某個(gè) sheet 頁(yè),獲取 Excel 范圍數(shù)據(jù)
wb.sheetnames
sheet = wb['shipping_rates']
lookup_table = sheet.tables['ship_cost']
lookup_table.ref

現(xiàn)在我們以及知道要加載的數(shù)據(jù)范圍了, 接下來(lái)就是將該范圍轉(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)就分享到這里了,我們下次再見(jiàn)!
推薦閱讀
