精通 Pandas:五大核心技巧助你玩轉(zhuǎn) Excel 數(shù)據(jù)處理
在數(shù)據(jù)分析領(lǐng)域,Python的Pandas庫無疑是處理表格數(shù)據(jù)的王者。而對于廣大與Excel打了多年交道的用戶來說,利用Pandas能夠?qū)⒎爆嵉氖謩硬僮髯詣踊瑯O大地提升工作效率。本文將深入探討使用Pandas處理Excel文件的五個高級技巧,助你從基礎(chǔ)操作晉升為數(shù)據(jù)處理高手。

技巧一:精準(zhǔn)讀取,駕馭非標(biāo)準(zhǔn)格式的Excel文件
現(xiàn)實工作中的Excel文件往往格式各異,數(shù)據(jù)并非總是整齊地從A1單元格開始。Pandas強(qiáng)大的read_excel函數(shù)提供了豐富的參數(shù),可以幫助我們精準(zhǔn)地定位并讀取所需數(shù)據(jù)。
(1) 處理復(fù)雜表頭與指定數(shù)據(jù)區(qū)域
面對包含多行標(biāo)題、注釋或者格式不規(guī)范的Excel表格,直接讀取通常會導(dǎo)致數(shù)據(jù)錯亂。此時,我們可以利用header和usecols參數(shù)來解決問題。
- header參數(shù):用于指定將哪一行作為列名。它可以是一個整數(shù)(行號,從0開始索引)或一個整數(shù)列表(用于創(chuàng)建多級索引)。例如,如果實際的表頭在文件的第三行,我們可以設(shè)置header=2。
- usecols參數(shù):用于選擇要讀取的列。它可以是列名的列表(如 ['ColumnA', 'ColumnB'])、列號的列表(如 [0, 2, 4]),甚至是Excel的列范圍表示法(如 'A:C,E')。 此外,usecols還支持傳入一個函數(shù),對每一列的名稱進(jìn)行判斷,返回True則讀取該列,這在處理大量且列名不固定的文件時非常有用。
代碼示例:
假設(shè)我們有一個Excel文件sales.xlsx,其數(shù)據(jù)從第3行開始,我們只需要讀取“產(chǎn)品名稱”、“銷量”和“銷售額”這三列。
import pandas as pd
# header=2 表示將第3行作為表頭
# usecols 指定需要讀取的列
df = pd.read_excel(
'sales.xlsx',
header=2,
usecols=['產(chǎn)品名稱', '銷量', '銷售額']
)
print(df.head())(2) 跳過特定行與讀取指定行數(shù)
有時候,我們需要跳過文件開頭的幾行或者結(jié)尾的匯總行。skiprows和nrows參數(shù)可以輕松實現(xiàn)這一需求。
- skiprows: 可以是一個整數(shù)(跳過開頭的N行)或一個列表(跳過指定的行號)。
- nrows: 用于指定從文件開頭讀取的行數(shù),這在處理超大文件時,先預(yù)覽一小部分?jǐn)?shù)據(jù)非常有用。
通過組合這些參數(shù),無論Excel文件的結(jié)構(gòu)多么復(fù)雜,我們都能像做外科手術(shù)一樣,精確地提取出所需的數(shù)據(jù)。
技巧二:性能優(yōu)化,高效處理海量Excel數(shù)據(jù)
當(dāng)Excel文件體積達(dá)到數(shù)百兆甚至數(shù)G時,直接用read_excel加載可能會導(dǎo)致內(nèi)存溢出和長時間的等待。 以下是幾個關(guān)鍵的性能優(yōu)化技巧。
(1) 分塊讀取(chunksize)
對于內(nèi)存無法一次性容納的大文件,chunksize參數(shù)是最佳解決方案。設(shè)置chunksize后,read_excel會返回一個迭代器,我們可以逐塊處理數(shù)據(jù),從而極大地降低內(nèi)存消耗。
代碼示例:
import pandas as pd
# 設(shè)置每個數(shù)據(jù)塊包含10000行
chunk_iterator = pd.read_excel('large_sales_data.xlsx', chunksize=10000)
# 初始化一個空的DataFrame用于匯總結(jié)果
processed_data = pd.DataFrame()
for chunk in chunk_iterator:
# 對每個數(shù)據(jù)塊進(jìn)行處理,例如篩選、計算等
filtered_chunk = chunk[chunk['銷售額'] > 1000]
processed_data = pd.concat([processed_data, filtered_chunk], ignore_index=True)
print(processed_data.shape)(2) 優(yōu)化數(shù)據(jù)類型(dtype)
Pandas在讀取數(shù)據(jù)時,默認(rèn)會使用int64或float64等內(nèi)存占用較大的數(shù)據(jù)類型。如果明確知道某列的數(shù)據(jù)范圍,可以在讀取時通過dtype參數(shù)指定更節(jié)省內(nèi)存的類型,如int32、float32,或者將重復(fù)度高的文本列指定為category類型。這能顯著降低DataFrame的內(nèi)存占用。
代碼示例:
import pandas as pd
# 為特定列指定更優(yōu)的數(shù)據(jù)類型
dtypes = {
'用戶ID': 'int32',
'產(chǎn)品類別': 'category',
'價格': 'float32'
}
df_optimized = pd.read_excel('sales_data.xlsx', dtype=dtypes)
# 查看優(yōu)化后的內(nèi)存使用情況
print(df_optimized.info(memory_usage='deep'))(3) 選擇更快的解析引擎
Pandas讀取Excel文件依賴于底層的解析引擎。默認(rèn)情況下,.xlsx文件使用openpyxl,.xls文件使用xlrd。在寫入Excel時,xlsxwriter通常比openpyxl具有更好的性能。
技巧三:樣式美化與自動化,打造高可讀性的Excel報告
將數(shù)據(jù)分析結(jié)果導(dǎo)出為Excel時,若能自動應(yīng)用樣式,無疑會使報告更具專業(yè)性和可讀性。Pandas的Styler對象結(jié)合XlsxWriter引擎,可以讓我們通過編程方式為Excel文件添加豐富的格式。
(1) 使用Styler對象設(shè)置樣式
Styler對象允許我們鏈?zhǔn)秸{(diào)用各種方法,對DataFrame進(jìn)行樣式設(shè)置,這些樣式最終可以被導(dǎo)出到Excel中。 我們可以設(shè)置字體、顏色、背景色、對齊方式和數(shù)據(jù)格式等。
- Styler.applymap(): 對每個單元格應(yīng)用樣式。
- Styler.apply(): 對行或列應(yīng)用樣式。
- Styler.highlight_max() / Styler.highlight_min(): 高亮最大值或最小值。
- Styler.background_gradient(): 應(yīng)用條件格式的背景色漸變。
代碼示例:
###注意:要提前pip install openpyxl
import pandas as pd
import numpy as np
# 創(chuàng)建示例數(shù)據(jù)
data = {'產(chǎn)品': ['A', 'B', 'C', 'D'],
'第一季度': [150, 200, 180, 220],
'第二季度': [170, 190, 210, 180],
'增長率': [0.13, -0.05, 0.17, -0.18]}
df = pd.DataFrame(data)
# 定義樣式函數(shù)
def style_negative_red(val):
color = 'red'if val < 0else'black'
returnf'color: {color}'
# 應(yīng)用樣式
styled_df = df.style.format({'增長率': '{:.2%}'}) \
.map(style_negative_red, subset=['增長率']) \
.highlight_max(subset=['第一季度', '第二季度'], color='lightgreen') \
.background_gradient(cmap='viridis', subset=['第一季度', '第二季度'])
# 導(dǎo)出到Excel
with pd.ExcelWriter('styled_report.xlsx', engine='openpyxl') as writer:
styled_df.to_excel(writer, sheet_name='季度報告', index=False)注意:to_excel方法導(dǎo)出樣式時,需要依賴openpyxl或xlsxwriter庫。

技巧四:多工作表(Sheet)高效處理
一個Excel工作簿中常常包含多個結(jié)構(gòu)相似的工作表,例如各分公司的月度銷售數(shù)據(jù)。Pandas可以高效地一次性讀取所有或指定的多個工作表,并進(jìn)行合并處理。
(1) 一次性讀取多個工作表
在read_excel中,將sheet_name參數(shù)設(shè)置為None,可以讀取所有工作表,并返回一個以工作表名稱為鍵、DataFrame為值的字典。如果傳入一個工作表名稱的列表,則只讀取指定的工作表。
代碼示例:
import pandas as pd
# 讀取所有工作表
all_sheets_dict = pd.read_excel('regional_sales.xlsx', sheet_name=None)
# 合并所有工作表的數(shù)據(jù),并添加一列指明來源工作表
all_data = []
for sheet_name, df in all_sheets_dict.items():
df['來源地區(qū)'] = sheet_name
all_data.append(df)
merged_df = pd.concat(all_data, ignore_index=True)
print(merged_df.head())(2) 將一個DataFrame拆分到多個工作表
反之,我們也可以將一個大的DataFrame根據(jù)某個分類列的值,拆分到不同的工作表中寫入。
代碼示例:
import pandas as pd
# 假設(shè)merged_df是包含所有地區(qū)銷售數(shù)據(jù)的DataFrame
with pd.ExcelWriter('sales_by_region.xlsx') as writer:
for region, data in merged_df.groupby('來源地區(qū)'):
# 將每個地區(qū)的數(shù)據(jù)寫入一個單獨的sheet,index=False表示不寫入行索引
data.to_excel(writer, sheet_name=region, index=False)技巧五:高級數(shù)據(jù)處理,函數(shù)應(yīng)用與數(shù)據(jù)透視
Pandas的強(qiáng)大遠(yuǎn)不止于讀寫,其核心優(yōu)勢在于強(qiáng)大的數(shù)據(jù)處理和分析能力,可以替代Excel中復(fù)雜的數(shù)據(jù)透視表和函數(shù)操作。
(1) 靈活的函數(shù)應(yīng)用(apply)
apply方法可以將一個自定義函數(shù)應(yīng)用于DataFrame的行或列,實現(xiàn)高度定制化的數(shù)據(jù)轉(zhuǎn)換和計算。
代碼示例:
import pandas as pd
df = pd.DataFrame({'單價': [10, 20, 30], '數(shù)量': [5, 8, 6]})
# 定義一個計算總價(考慮折扣)的函數(shù)
def calculate_total(row):
price = row['單價'] * row['數(shù)量']
if price > 150:
return price * 0.9 # 超過150元打九折
return price
# axis=1 表示按行應(yīng)用函數(shù)
df['總價'] = df.apply(calculate_total, axis=1)
print(df)
(2) 強(qiáng)大的數(shù)據(jù)透視(pivot_table)
pivot_table是Pandas中實現(xiàn)數(shù)據(jù)透視功能的利器,功能與Excel的數(shù)據(jù)透視表類似但更為靈活。它可以根據(jù)一個或多個鍵對數(shù)據(jù)進(jìn)行聚合,輕松完成分類匯總統(tǒng)計。
代碼示例:
import pandas as pd
# 假設(shè)有包含“日期”、“城市”、“產(chǎn)品類別”、“銷售額”的DataFrame
# df_sales = pd.read_excel('all_sales.xlsx')
# 創(chuàng)建數(shù)據(jù)透視表,按城市和產(chǎn)品類別匯總銷售額
pivot = pd.pivot_table(
df_sales,
values='銷售額',
index='城市',
columns='產(chǎn)品類別',
aggfunc='sum', # 聚合函數(shù)為求和
fill_value=0 # 對缺失值填充為0
)
print(pivot)掌握以上五個技巧,你將能更加從容地應(yīng)對各種復(fù)雜的Excel處理任務(wù),將重復(fù)性的工作交給代碼,從而聚焦于更有價值的數(shù)據(jù)洞察和分析。


























