Python數(shù)據(jù)自動化處理之?dāng)?shù)據(jù)清洗和報表生成詳解
前面我們已經(jīng)搞定了:看板、AI助手、郵件機器人。但還有一個超級痛點:數(shù)據(jù)處理。
很多同學(xué)每天都要:
- 從各個系統(tǒng)導(dǎo)出原始數(shù)據(jù)(Excel/CSV/TXT)
- 手動去重、補全缺失值、統(tǒng)一格式
- 生成日報/周報/月報
- 手動調(diào)整字體、顏色、圖表,美化報表
- 重復(fù)同樣的操作,枯燥又容易出錯
今天就用極簡代碼,帶你實現(xiàn)一套全自動數(shù)據(jù)處理流水線:自動讀取原始數(shù)據(jù) → 自動清洗 → 自動生成報表 → 自動美化 → 自動保存,真正實現(xiàn)“一鍵出報表”。
一、本次你能學(xué)到什么
用 Python 自動讀取多種格式數(shù)據(jù)(Excel/CSV)
自動數(shù)據(jù)清洗(去重、補全、格式轉(zhuǎn)換、異常值處理)
自動生成統(tǒng)計指標(biāo)(求和、平均、最大值、最小值)
自動插入圖表(柱狀圖、折線圖、餅圖)
一鍵美化報表(字體、顏色、邊框、對齊)
做成可復(fù)用的工具,下次直接用
二、前期準(zhǔn)備(1 分鐘搞定)
1. 安裝依賴
打開命令行執(zhí)行:
pip install pandas openpyxl xlsxwriter python-dotenv
2. 準(zhǔn)備測試數(shù)據(jù)
新建一個 raw_data 文件夾,放一些測試用的 Excel/CSV 文件(模擬從系統(tǒng)導(dǎo)出的原始數(shù)據(jù))。
三、核心代碼:全自動數(shù)據(jù)處理流水線(完整可跑)
新建文件:data_processor.py
# -*- coding: utf-8 -*-
import pandas as pd
import os
from datetime import datetime
from dotenv import load_dotenv
# 加載配置
load_dotenv()
# 路徑配置
RAW_DATA_PATH = "raw_data"
OUTPUT_PATH = "processed_reports"
if not os.path.exists(OUTPUT_PATH):
os.mkdir(OUTPUT_PATH)
# ---------------------------
# 1. 讀取原始數(shù)據(jù)
# ---------------------------
def read_raw_data(file_path):
"""自動識別文件格式并讀取"""
ext = os.path.splitext(file_path)[1].lower()
if ext == ".xlsx":
return pd.read_excel(file_path)
elif ext == ".csv":
return pd.read_csv(file_path)
else:
raise ValueError(f"不支持的文件格式:{ext}")
# ---------------------------
# 2. 自動數(shù)據(jù)清洗
# ---------------------------
def clean_data(df):
"""
通用數(shù)據(jù)清洗函數(shù):
1. 去重
2. 補全缺失值
3. 格式轉(zhuǎn)換
4. 異常值處理
"""
# 復(fù)制一份,避免修改原數(shù)據(jù)
df_clean = df.copy()
# 1. 去重
before_count = len(df_clean)
df_clean = df_clean.drop_duplicates()
after_count = len(df_clean)
print(f"?? 去重:刪除了 {before_count - after_count} 條重復(fù)數(shù)據(jù)")
# 2. 補全缺失值
# 數(shù)值型列用平均值填充
numeric_cols = df_clean.select_dtypes(include=['number']).columns
df_clean[numeric_cols] = df_clean[numeric_cols].fillna(df_clean[numeric_cols].mean())
# 文本型列用"未知"填充
text_cols = df_clean.select_dtypes(include=['object']).columns
df_clean[text_cols] = df_clean[text_cols].fillna("未知")
print("?? 補全缺失值:已處理所有空值")
# 3. 格式轉(zhuǎn)換(日期列統(tǒng)一格式)
date_cols = [col for col in df_clean.columns if 'date' in col.lower() or '時間' in col]
for col in date_cols:
try:
df_clean[col] = pd.to_datetime(df_clean[col]).dt.strftime('%Y-%m-%d')
except:
pass
print("?? 格式轉(zhuǎn)換:日期列已統(tǒng)一格式")
# 4. 異常值處理(簡單的3σ原則)
for col in numeric_cols:
mean = df_clean[col].mean()
std = df_clean[col].std()
lower = mean - 3 * std
upper = mean + 3 * std
# 異常值用中位數(shù)替換
median = df_clean[col].median()
df_clean[col] = df_clean[col].apply(lambda x: median if x < lower or x > upper else x)
print("?? 異常值處理:已處理數(shù)值型列的異常值")
return df_clean
# ---------------------------
# 3. 自動生成統(tǒng)計指標(biāo)
# ---------------------------
def generate_stats(df, group_col, value_col):
"""
生成統(tǒng)計報表:
按 group_col 分組,統(tǒng)計 value_col 的 總和、平均值、最大值、最小值
"""
stats = df.groupby(group_col).agg(
總和=(value_col, 'sum'),
平均值=(value_col, 'mean'),
最大值=(value_col, 'max'),
最小值=(value_col, 'min'),
數(shù)量=(value_col, 'count')
).reset_index()
# 格式化數(shù)值(保留2位小數(shù))
numeric_cols = ['總和', '平均值', '最大值', '最小值']
stats[numeric_cols] = stats[numeric_cols].round(2)
print(f"?? 統(tǒng)計完成:按 {group_col} 分組,統(tǒng)計 {value_col}")
return stats
# ---------------------------
# 4. 一鍵美化報表(Excel)
# ---------------------------
def beautify_excel(file_path, sheet_names):
"""
美化Excel報表:
1. 設(shè)置表頭樣式
2. 設(shè)置列寬
3. 設(shè)置邊框
4. 設(shè)置對齊
"""
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
wb = load_workbook(file_path)
# 定義樣式
header_font = Font(name='微軟雅黑', size=12, bold=True, color='FFFFFF')
header_fill = PatternFill(start_color='165DFF', end_color='165DFF', fill_type='solid')
header_alignment = Alignment(horizontal='center', vertical='center')
cell_font = Font(name='微軟雅黑', size=10)
cell_alignment = Alignment(horizontal='center', vertical='center')
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
for sheet_name in sheet_names:
if sheet_name not in wb.sheetnames:
continue
ws = wb[sheet_name]
# 設(shè)置表頭
for cell in ws[1]:
cell.font = header_font
cell.fill = header_fill
cell.alignment = header_alignment
cell.border = thin_border
# 設(shè)置數(shù)據(jù)行
for row in ws.iter_rows(min_row=2):
for cell in row:
cell.font = cell_font
cell.alignment = cell_alignment
cell.border = thin_border
# 自動調(diào)整列寬
for column in ws.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = min(max_length + 2, 50)
ws.column_dimensions[column_letter].width = adjusted_width
wb.save(file_path)
print("?? 美化完成:Excel報表已一鍵美化")
# ---------------------------
# 5. 自動插入圖表
# ---------------------------
def add_charts_to_excel(file_path, stats_df, sheet_name, chart_type='bar'):
"""
在Excel中插入圖表
"""
import xlsxwriter
# 用xlsxwriter重新寫入(方便插入圖表)
temp_path = file_path.replace('.xlsx', '_temp.xlsx')
with pd.ExcelWriter(temp_path, engine='xlsxwriter') as writer:
stats_df.to_excel(writer, sheet_name=sheet_name, index=False)
workbook = writer.book
worksheet = writer.sheets[sheet_name]
# 創(chuàng)建圖表
if chart_type == 'bar':
chart = workbook.add_chart({'type': 'column'})
elif chart_type == 'line':
chart = workbook.add_chart({'type': 'line'})
elif chart_type == 'pie':
chart = workbook.add_chart({'type': 'pie'})
else:
chart = workbook.add_chart({'type': 'column'})
# 配置圖表數(shù)據(jù)
max_row = len(stats_df)
chart.add_series({
'name': [sheet_name, 0, 1],
'categories': [sheet_name, 1, 0, max_row, 0],
'values': [sheet_name, 1, 1, max_row, 1],
})
# 設(shè)置圖表標(biāo)題
chart.set_title({'name': f'{stats_df.columns[0]} vs {stats_df.columns[1]}'})
chart.set_x_axis({'name': stats_df.columns[0]})
chart.set_y_axis({'name': stats_df.columns[1]})
# 插入圖表
worksheet.insert_chart('F2', chart)
# 替換原文件
os.replace(temp_path, file_path)
print("?? 圖表插入完成")
# ---------------------------
# 主函數(shù):一鍵處理數(shù)據(jù)
# ---------------------------
def run_data_processor(file_name, group_col, value_col, chart_type='bar'):
print("?? 數(shù)據(jù)處理流水線啟動...")
# 1. 讀取數(shù)據(jù)
file_path = os.path.join(RAW_DATA_PATH, file_name)
if not os.path.exists(file_path):
print(f"? 文件不存在:{file_path}")
return
df = read_raw_data(file_path)
print(f"? 讀取成功:共 {len(df)} 條數(shù)據(jù)")
# 2. 清洗數(shù)據(jù)
df_clean = clean_data(df)
# 3. 生成統(tǒng)計
stats = generate_stats(df_clean, group_col, value_col)
# 4. 保存結(jié)果
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
output_file = os.path.join(OUTPUT_PATH, f'報表_{timestamp}.xlsx')
# 寫入多個sheet
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
df_clean.to_excel(writer, sheet_name='清洗后數(shù)據(jù)', index=False)
stats.to_excel(writer, sheet_name='統(tǒng)計報表', index=False)
# 5. 插入圖表
add_charts_to_excel(output_file, stats, '統(tǒng)計報表', chart_type)
# 6. 美化報表
beautify_excel(output_file, ['清洗后數(shù)據(jù)', '統(tǒng)計報表'])
print(f"?? 全部完成!報表已保存至:{output_file}")
return output_file
if __name__ == "__main__":
# 示例:處理銷售數(shù)據(jù),按"產(chǎn)品"分組,統(tǒng)計"銷售額",插入柱狀圖
# 你需要先在 raw_data 文件夾放一個測試文件
# run_data_processor('銷售數(shù)據(jù).xlsx', '產(chǎn)品', '銷售額', 'bar')
print("請在代碼中配置你的數(shù)據(jù)文件和統(tǒng)計字段后運行!")
新建 .env 文件(可選):
# 可以在這里配置默認(rèn)參數(shù) DEFAULT_GROUP_COL=產(chǎn)品 DEFAULT_VALUE_COL=銷售額 DEFAULT_CHART_TYPE=bar
四、運行效果(直接看得到)
運行后你會立刻看到:
1.控制臺顯示每一步的處理進(jìn)度
2.processed_reports 文件夾生成一個帶時間戳的 Excel 文件
3.Excel 包含兩個 sheet:
- 清洗后數(shù)據(jù):去重、補全、格式統(tǒng)一
- 統(tǒng)計報表:自動計算的指標(biāo) + 自動插入的圖表
4.報表已經(jīng)一鍵美化:藍(lán)色表頭、統(tǒng)一字體、自動列寬、居中對齊
你以后只需要:把原始數(shù)據(jù)丟進(jìn) raw_data → 改一下代碼里的字段名 → 運行 → 拿報表
五、可以直接擴展的進(jìn)階功能
你可以在這篇基礎(chǔ)上隨便加,非常適合寫進(jìn)博客:
- 批量處理文件夾:自動遍歷 raw_data 下所有文件
- 自動發(fā)送郵件:和你前面的郵件機器人聯(lián)動,報表生成后自動發(fā)出去
- 定時生成:每天早上 8 點自動生成昨天的日報
- 多維度統(tǒng)計:同時按多個維度分組(產(chǎn)品+部門+時間)
- 和看板聯(lián)動:把統(tǒng)計結(jié)果直接推送到你的辦公看板
六、總結(jié)
本篇我們實現(xiàn)了企業(yè)級全自動數(shù)據(jù)處理流水線,從 0 到 1 完成:原始數(shù)據(jù)讀取 → 自動清洗(去重/補全/格式轉(zhuǎn)換)→ 自動統(tǒng)計 → 自動插入圖表 → 一鍵美化。
代碼輕量、穩(wěn)定、可復(fù)用,新手也能直接跑起來,每天幫你節(jié)省大量處理數(shù)據(jù)的時間。
這也是辦公自動化體系里非常核心的一環(huán):數(shù)據(jù)處理是基礎(chǔ),看板負(fù)責(zé)展示,AI 助手負(fù)責(zé)交互,郵件機器人負(fù)責(zé)分發(fā),真正實現(xiàn)全流程自動化。
到此這篇關(guān)于Python數(shù)據(jù)自動化處理之?dāng)?shù)據(jù)清洗和報表生成詳解的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用xlrd與xlwt對excel的讀寫和格式設(shè)定
最近在用python處理excel表的時候出現(xiàn)了一些問題,所以想著記錄下最后的實現(xiàn)方式和問題解決方法。方便自己或者大家在有需要的時候參考借鑒,下面這篇文章主要就介紹了python使用xlrd與xlwt對excel的讀寫和格式設(shè)定的相關(guān)資料,一起來學(xué)習(xí)學(xué)習(xí)吧。2017-01-01
Python基于正則表達(dá)式實現(xiàn)計算器功能
這篇文章主要介紹了Python基于正則表達(dá)式實現(xiàn)計算器功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
python3模擬實現(xiàn)xshell遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法
今天小編就為大家分享一篇python3模擬實現(xiàn)xshell遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
從安裝到到高級排錯詳解Mac上優(yōu)雅管理Python多版本的全攻略
作為Python開發(fā)者,在Mac上管理多個Python版本是一項必備技能,本文將帶你從基礎(chǔ)安裝到高級排錯,一站式解決所有問題,希望對大家有所幫助2026-02-02

