引言
日常工作中,經常需要處理多份 Excel 表格:比如合并銷售數據、清洗重復的用戶信息,最后生成可視化圖表。手動操作不僅效率低,還容易出錯。這篇文章分享一套 Python 自動化流程,用pandas
和matplotlib
搞定從數據清洗到可視化的全流程,附完整代碼和避坑指南。
一、環境準備
需要安裝的庫:
pip install pandas openpyxl matplotlib # openpyxl用于讀取xlsx格式
避坑點:如果 Excel 是
.xls
格式,需額外安裝xlrd==1.2.0
(高版本不支持 xls)。
二、核心步驟(附代碼)
1. 讀取并合并多份 Excel 文件
假設文件夾data/
下有 3 個銷售數據文件(sale1.xlsx
、sale2.xlsx
、sale3.xlsx
),結構相同(含 “日期”“產品”“銷售額” 列)。
import pandas as pd
import os# 讀取文件夾下所有Excel
file_dir = "data/"
all_data = []
for file in os.listdir(file_dir):if file.endswith(".xlsx"):df = pd.read_excel(os.path.join(file_dir, file))all_data.append(df)# 合并為一個DataFrame
merged_df = pd.concat(all_data, ignore_index=True)
print(f"合并后共{len(merged_df)}行數據")
2. 清洗重復值
目標:刪除 “產品 + 日期” 完全重復的行(避免重復統計)。
# 查看重復值數量
print(f"重復值行數:{merged_df.duplicated(subset=['產品', '日期']).sum()}")# 刪除重復值(保留第一行)
cleaned_df = merged_df.drop_duplicates(subset=['產品', '日期'], keep='first')
3. 缺失值處理
如果 “銷售額” 列有缺失,用該產品的平均值填充(比直接刪除更合理):
# 按“產品”分組,用組內平均值填充缺失值
cleaned_df['銷售額'] = cleaned_df.groupby('產品')['銷售額'].transform(lambda x: x.fillna(x.mean())
)
4. 數據可視化(生成銷量趨勢圖)
以 “產品 A” 為例,繪制月度銷售額折線圖:
import matplotlib.pyplot as plt# 設置中文顯示(避免亂碼)
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]# 篩選產品A的數據,按月份分組求和
product_a = cleaned_df[cleaned_df['產品'] == '產品A']
product_a['月份'] = product_a['日期'].dt.to_period('M') # 提取月份
monthly_sales = product_a.groupby('月份')['銷售額'].sum()# 繪圖
monthly_sales.plot(kind='line', figsize=(10, 6))
plt.title('產品A月度銷售額趨勢')
plt.xlabel('月份')
plt.ylabel('銷售額(元)')
plt.grid(alpha=0.3)
plt.savefig('sales_trend.png', dpi=300) # 保存圖片
plt.show()
三、完整代碼總結
將上述步驟整合為一個函數,方便復用:
def process_excel(file_dir, target_product):# 1. 讀取合并數據(代碼同上)# 2. 清洗重復值(代碼同上)# 3. 處理缺失值(代碼同上)# 4. 可視化(代碼同上)return cleaned_df # 返回處理后的DataFrame# 調用示例
df = process_excel("data/", "產品A")
四、擴展思考
- 如果數據量超過 10 萬行,建議用
dask
替代pandas
,避免內存溢出; - 可視化也可以嘗試
seaborn
,圖表更美觀(如sns.lineplot()
)。 - 你在處理 Excel 時遇到過哪些棘手問題?歡迎留言分享你的解決方案~