基于Python+pandas實(shí)現(xiàn)Excel數(shù)據(jù)統(tǒng)計(jì)分析自動(dòng)化完整指南
在很多辦公自動(dòng)化場(chǎng)景里,Excel 是數(shù)據(jù)流轉(zhuǎn)的入口:銷售明細(xì)、考勤記錄、庫(kù)存臺(tái)賬、項(xiàng)目工時(shí)、財(cái)務(wù)流水,通常都會(huì)先以 .xlsx 文件的形式出現(xiàn)。如果數(shù)據(jù)量不大,手工篩選和透視表可以解決問(wèn)題;但當(dāng)文件每天都要處理、規(guī)則經(jīng)常重復(fù)、結(jié)果還要導(dǎo)出給同事時(shí),用 Python + pandas 自動(dòng)化處理會(huì)更穩(wěn)定,也更容易沉淀成可復(fù)用腳本。
本文圍繞一個(gè)常見(jiàn)的“銷售訂單 Excel 統(tǒng)計(jì)分析”案例,系統(tǒng)演示 pandas 的 DataFrame 基本概念、讀取 Excel、數(shù)據(jù)篩選、數(shù)據(jù)排序、分組統(tǒng)計(jì)、缺失值處理,以及導(dǎo)出新的 Excel 文件。
1. pandas 庫(kù)簡(jiǎn)介
pandas 是 Python 數(shù)據(jù)分析領(lǐng)域最常用的第三方庫(kù)之一,適合處理結(jié)構(gòu)化數(shù)據(jù),例如 Excel、CSV、數(shù)據(jù)庫(kù)查詢結(jié)果、日志表格等。它的優(yōu)勢(shì)主要有三點(diǎn):
- 表格數(shù)據(jù)處理能力強(qiáng):可以像操作 Excel 表一樣操作行、列、篩選條件和統(tǒng)計(jì)字段。
- API 簡(jiǎn)潔:讀取 Excel、分組統(tǒng)計(jì)、排序、缺失值處理通常只需要幾行代碼。
- 生態(tài)成熟:可以和
openpyxl、xlsxwriter、matplotlib、SQLAlchemy 等庫(kù)配合,完成報(bào)表生成、圖表繪制、數(shù)據(jù)庫(kù)讀寫等工作。
安裝 pandas 和 Excel 讀取引擎:
pip install pandas openpyxl
其中:
pandas負(fù)責(zé)數(shù)據(jù)處理。openpyxl負(fù)責(zé)讀取和寫入.xlsx文件。
2. DataFrame 基本概念
pandas 中最核心的數(shù)據(jù)結(jié)構(gòu)是 DataFrame??梢园阉斫鉃?Python 里的“二維表格”:
- 每一行代表一條記錄,例如一筆訂單。
- 每一列代表一個(gè)字段,例如訂單編號(hào)、地區(qū)、銷售額。
- 行索引用來(lái)定位記錄。
- 列名用來(lái)訪問(wèn)字段。
例如下面這張 Excel 表:
| 訂單編號(hào) | 日期 | 地區(qū) | 產(chǎn)品 | 銷售員 | 銷售額 | 成本 | 狀態(tài) |
|---|---|---|---|---|---|---|---|
| SO2026001 | 2026-04-01 | 華東 | 筆記本電腦 | 張三 | 8500 | 6500 | 已完成 |
| SO2026002 | 2026-04-02 | 華南 | 顯示器 | 李四 | 1800 | 1200 | 已完成 |
| SO2026003 | 2026-04-03 | 華北 | 打印機(jī) | 王五 | 2600 | 1900 | 退款 |
讀入 pandas 后,就是一個(gè) DataFrame 對(duì)象。我們可以用代碼完成篩選、計(jì)算利潤(rùn)、統(tǒng)計(jì)各地區(qū)銷售額等操作。
3. 讀取 Excel 文件
讀取 Excel 最常用的是 pd.read_excel():
import pandas as pd
df = pd.read_excel("sales_orders.xlsx", sheet_name="訂單明細(xì)")
print(df.head())
print(df.info())
常用參數(shù)說(shuō)明:
io:Excel 文件路徑。sheet_name:工作表名稱或索引,默認(rèn)讀取第一個(gè)工作表。usecols:指定讀取哪些列,例如"A:H"或["訂單編號(hào)", "地區(qū)", "銷售額"]。dtype:指定字段類型,常用于訂單編號(hào)、手機(jī)號(hào)等不能被當(dāng)成數(shù)字處理的字段。parse_dates:指定日期列自動(dòng)轉(zhuǎn)成日期類型。
示例:
df = pd.read_excel(
"sales_orders.xlsx",
sheet_name="訂單明細(xì)",
dtype={"訂單編號(hào)": str},
parse_dates=["日期"]
)
4. 數(shù)據(jù)篩選
數(shù)據(jù)篩選是辦公自動(dòng)化中最常見(jiàn)的操作。pandas 使用布爾條件篩選行。
4.1 篩選已完成訂單
completed_df = df[df["狀態(tài)"] == "已完成"]
4.2 篩選銷售額大于 5000 的訂單
large_orders = df[df["銷售額"] > 5000]
4.3 多條件篩選
篩選“華東地區(qū)且已完成”的訂單:
east_completed = df[(df["地區(qū)"] == "華東") & (df["狀態(tài)"] == "已完成")]
篩選“銷售額大于 5000 或產(chǎn)品為筆記本電腦”的訂單:
important_orders = df[(df["銷售額"] > 5000) | (df["產(chǎn)品"] == "筆記本電腦")]
注意:多個(gè)條件之間要使用 &、|,每個(gè)條件都要用括號(hào)包起來(lái)。
5. 數(shù)據(jù)排序
排序使用 sort_values()。
5.1 按銷售額從高到低排序
df_sorted = df.sort_values(by="銷售額", ascending=False)
5.2 按地區(qū)和銷售額排序
先按地區(qū)升序,再按銷售額降序:
df_sorted = df.sort_values(
by=["地區(qū)", "銷售額"],
ascending=[True, False]
)
排序后如果希望重置行號(hào):
df_sorted = df_sorted.reset_index(drop=True)
6. 分組統(tǒng)計(jì)
分組統(tǒng)計(jì)是 pandas 最適合替代 Excel 透視表的能力之一,核心方法是 groupby()。
6.1 按地區(qū)統(tǒng)計(jì)銷售額
region_summary = df.groupby("地區(qū)", as_index=False)["銷售額"].sum()
結(jié)果類似:
| 地區(qū) | 銷售額 |
|---|---|
| 華東 | 35000 |
| 華南 | 28000 |
| 華北 | 19000 |
6.2 按地區(qū)統(tǒng)計(jì)銷售額、成本和利潤(rùn)
先增加利潤(rùn)列:
df["利潤(rùn)"] = df["銷售額"] - df["成本"]
再分組統(tǒng)計(jì):
region_summary = df.groupby("地區(qū)", as_index=False).agg(
訂單數(shù)=("訂單編號(hào)", "count"),
銷售額合計(jì)=("銷售額", "sum"),
成本合計(jì)=("成本", "sum"),
利潤(rùn)合計(jì)=("利潤(rùn)", "sum")
)
6.3 按銷售員統(tǒng)計(jì)業(yè)績(jī)
seller_summary = df.groupby("銷售員", as_index=False).agg(
訂單數(shù)=("訂單編號(hào)", "count"),
銷售額合計(jì)=("銷售額", "sum"),
平均客單價(jià)=("銷售額", "mean")
)
為了讓結(jié)果更適合閱讀,可以按銷售額排序:
seller_summary = seller_summary.sort_values(
by="銷售額合計(jì)",
ascending=False
).reset_index(drop=True)
7. 缺失值處理
真實(shí)業(yè)務(wù)數(shù)據(jù)很少完全干凈。Excel 中可能存在空單元格、空字符串、未填寫狀態(tài)、缺失成本等情況。
7.1 查看缺失值數(shù)量
print(df.isna().sum())
7.2 填充文本字段缺失值
例如銷售員為空時(shí)填充為“未分配”:
df["銷售員"] = df["銷售員"].fillna("未分配")
7.3 填充數(shù)值字段缺失值
例如成本為空時(shí)填充為 0:
df["成本"] = df["成本"].fillna(0)
7.4 刪除關(guān)鍵字段缺失的記錄
如果訂單編號(hào)或銷售額缺失,這類數(shù)據(jù)通常不能參與統(tǒng)計(jì),可以刪除:
df = df.dropna(subset=["訂單編號(hào)", "銷售額"])
7.5 清理字符串空格
有些 Excel 數(shù)據(jù)看起來(lái)一樣,實(shí)際包含前后空格,會(huì)影響分組統(tǒng)計(jì):
text_columns = ["地區(qū)", "產(chǎn)品", "銷售員", "狀態(tài)"]
for col in text_columns:
df[col] = df[col].astype(str).str.strip()
8. 導(dǎo)出新的 Excel 文件
導(dǎo)出單個(gè)工作表:
df.to_excel("cleaned_sales_orders.xlsx", index=False)
如果要把“清洗后的明細(xì)”“地區(qū)統(tǒng)計(jì)”“銷售員統(tǒng)計(jì)”寫入同一個(gè) Excel 文件,可以使用 ExcelWriter:
with pd.ExcelWriter("sales_analysis_report.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="清洗后明細(xì)", index=False)
region_summary.to_excel(writer, sheet_name="地區(qū)統(tǒng)計(jì)", index=False)
seller_summary.to_excel(writer, sheet_name="銷售員統(tǒng)計(jì)", index=False)
這樣生成的 Excel 文件更適合作為日?qǐng)?bào)、周報(bào)或月報(bào)附件。
9. 完整案例代碼
下面給出一個(gè)完整腳本。它會(huì):
- 讀取銷售訂單 Excel。
- 清理缺失值和文本空格。
- 過(guò)濾掉退款訂單。
- 計(jì)算利潤(rùn)和利潤(rùn)率。
- 生成地區(qū)統(tǒng)計(jì)、銷售員統(tǒng)計(jì)、產(chǎn)品統(tǒng)計(jì)。
- 導(dǎo)出一個(gè)新的多工作表 Excel 分析報(bào)告。
from pathlib import Path
import pandas as pd
INPUT_FILE = Path("sales_orders.xlsx")
OUTPUT_FILE = Path("sales_analysis_report.xlsx")
def load_sales_data(file_path: Path) -> pd.DataFrame:
"""讀取銷售訂單 Excel。"""
df = pd.read_excel(
file_path,
sheet_name="訂單明細(xì)",
dtype={"訂單編號(hào)": str},
parse_dates=["日期"]
)
return df
def clean_sales_data(df: pd.DataFrame) -> pd.DataFrame:
"""清洗銷售訂單數(shù)據(jù)。"""
df = df.copy()
required_columns = ["訂單編號(hào)", "日期", "地區(qū)", "產(chǎn)品", "銷售員", "銷售額", "成本", "狀態(tài)"]
missing_columns = [col for col in required_columns if col not in df.columns]
if missing_columns:
raise ValueError(f"Excel 缺少必要字段: {missing_columns}")
# 刪除關(guān)鍵字段缺失的記錄
df = df.dropna(subset=["訂單編號(hào)", "銷售額"])
# 文本字段去除前后空格,并填充業(yè)務(wù)默認(rèn)值
text_columns = ["地區(qū)", "產(chǎn)品", "銷售員", "狀態(tài)"]
for col in text_columns:
df[col] = df[col].fillna("未填寫").astype(str).str.strip()
# 數(shù)值字段轉(zhuǎn)成數(shù)字,異常值轉(zhuǎn)為 NaN 后再填充
df["銷售額"] = pd.to_numeric(df["銷售額"], errors="coerce")
df["成本"] = pd.to_numeric(df["成本"], errors="coerce")
df = df.dropna(subset=["銷售額"])
df["成本"] = df["成本"].fillna(0)
# 日期字段統(tǒng)一轉(zhuǎn)換
df["日期"] = pd.to_datetime(df["日期"], errors="coerce")
# 只統(tǒng)計(jì)已完成訂單,排除退款、取消等狀態(tài)
df = df[df["狀態(tài)"] == "已完成"].copy()
# 增加業(yè)務(wù)分析字段
df["利潤(rùn)"] = df["銷售額"] - df["成本"]
df["利潤(rùn)率"] = df["利潤(rùn)"] / df["銷售額"]
return df.reset_index(drop=True)
def build_summary(df: pd.DataFrame) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]:
"""生成地區(qū)、銷售員和產(chǎn)品三個(gè)維度的統(tǒng)計(jì)表。"""
region_summary = df.groupby("地區(qū)", as_index=False).agg(
訂單數(shù)=("訂單編號(hào)", "count"),
銷售額合計(jì)=("銷售額", "sum"),
成本合計(jì)=("成本", "sum"),
利潤(rùn)合計(jì)=("利潤(rùn)", "sum"),
平均訂單金額=("銷售額", "mean")
)
region_summary["利潤(rùn)率"] = region_summary["利潤(rùn)合計(jì)"] / region_summary["銷售額合計(jì)"]
region_summary = region_summary.sort_values("銷售額合計(jì)", ascending=False)
seller_summary = df.groupby("銷售員", as_index=False).agg(
訂單數(shù)=("訂單編號(hào)", "count"),
銷售額合計(jì)=("銷售額", "sum"),
利潤(rùn)合計(jì)=("利潤(rùn)", "sum"),
平均客單價(jià)=("銷售額", "mean")
)
seller_summary = seller_summary.sort_values("銷售額合計(jì)", ascending=False)
product_summary = df.groupby("產(chǎn)品", as_index=False).agg(
訂單數(shù)=("訂單編號(hào)", "count"),
銷售額合計(jì)=("銷售額", "sum"),
利潤(rùn)合計(jì)=("利潤(rùn)", "sum")
)
product_summary = product_summary.sort_values("銷售額合計(jì)", ascending=False)
return (
region_summary.reset_index(drop=True),
seller_summary.reset_index(drop=True),
product_summary.reset_index(drop=True)
)
def export_report(
detail_df: pd.DataFrame,
region_summary: pd.DataFrame,
seller_summary: pd.DataFrame,
product_summary: pd.DataFrame,
output_file: Path
) -> None:
"""導(dǎo)出 Excel 分析報(bào)告。"""
with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
detail_df.to_excel(writer, sheet_name="清洗后明細(xì)", index=False)
region_summary.to_excel(writer, sheet_name="地區(qū)統(tǒng)計(jì)", index=False)
seller_summary.to_excel(writer, sheet_name="銷售員統(tǒng)計(jì)", index=False)
product_summary.to_excel(writer, sheet_name="產(chǎn)品統(tǒng)計(jì)", index=False)
def main() -> None:
raw_df = load_sales_data(INPUT_FILE)
cleaned_df = clean_sales_data(raw_df)
region_summary, seller_summary, product_summary = build_summary(cleaned_df)
export_report(cleaned_df, region_summary, seller_summary, product_summary, OUTPUT_FILE)
print(f"分析完成,已生成文件: {OUTPUT_FILE.resolve()}")
if __name__ == "__main__":
main()
10. 工作中的實(shí)際應(yīng)用場(chǎng)景
Python + pandas 處理 Excel 的價(jià)值,不只是“少點(diǎn)幾下鼠標(biāo)”,更重要的是把重復(fù)、易錯(cuò)、依賴人工經(jīng)驗(yàn)的流程標(biāo)準(zhǔn)化。
10.1 銷售日?qǐng)?bào)和月報(bào)
銷售部門每天導(dǎo)出訂單明細(xì)后,可以自動(dòng)生成:
- 各地區(qū)銷售額排名。
- 各銷售員業(yè)績(jī)排名。
- 產(chǎn)品銷量和利潤(rùn)統(tǒng)計(jì)。
- 異常訂單清單,例如退款、負(fù)利潤(rùn)、高折扣訂單。
腳本每天跑一次,就能把報(bào)表結(jié)果穩(wěn)定輸出到固定目錄。
10.2 財(cái)務(wù)對(duì)賬
財(cái)務(wù)經(jīng)常需要比對(duì)訂單系統(tǒng)、支付平臺(tái)和發(fā)票系統(tǒng)的數(shù)據(jù)。pandas 可以用訂單號(hào)、流水號(hào)等字段做合并和差異檢查,自動(dòng)找出:
- 系統(tǒng)有訂單但支付平臺(tái)無(wú)流水的數(shù)據(jù)。
- 支付成功但未開(kāi)票的數(shù)據(jù)。
- 金額不一致的數(shù)據(jù)。
- 重復(fù)入賬的數(shù)據(jù)。
10.3 人事考勤統(tǒng)計(jì)
考勤機(jī)導(dǎo)出的 Excel 通常字段多、格式不統(tǒng)一。通過(guò) pandas 可以清理日期、員工編號(hào)、部門名稱,再統(tǒng)計(jì):
- 遲到次數(shù)。
- 缺卡次數(shù)。
- 加班時(shí)長(zhǎng)。
- 部門出勤率。
10.4 庫(kù)存和采購(gòu)分析
對(duì)于庫(kù)存臺(tái)賬,可以用 pandas 統(tǒng)計(jì):
- 各倉(cāng)庫(kù)庫(kù)存數(shù)量。
- 低庫(kù)存預(yù)警清單。
- 高周轉(zhuǎn)和低周轉(zhuǎn)商品。
- 采購(gòu)金額和供應(yīng)商占比。
10.5 批量數(shù)據(jù)質(zhì)檢
當(dāng) Excel 是業(yè)務(wù)系統(tǒng)導(dǎo)入前的模板時(shí),可以先用 pandas 做校驗(yàn):
- 必填字段是否為空。
- 身份證號(hào)、手機(jī)號(hào)、郵箱格式是否正確。
- 金額字段是否為負(fù)數(shù)。
- 枚舉字段是否超出允許范圍。
發(fā)現(xiàn)問(wèn)題后,把異常數(shù)據(jù)單獨(dú)導(dǎo)出給業(yè)務(wù)人員修改,比導(dǎo)入系統(tǒng)后再報(bào)錯(cuò)更高效。
11. 實(shí)戰(zhàn)建議
在真實(shí)項(xiàng)目中使用 pandas 處理 Excel,可以遵循下面幾條經(jīng)驗(yàn):
- 先明確輸入字段和輸出結(jié)果,不要一邊寫代碼一邊猜業(yè)務(wù)規(guī)則。
- 對(duì)關(guān)鍵字段做校驗(yàn),例如訂單編號(hào)、日期、金額、狀態(tài)。
- 清洗數(shù)據(jù)時(shí)盡量保留原始文件,不要直接覆蓋源 Excel。
- 中間結(jié)果拆成多個(gè)函數(shù),方便后續(xù)維護(hù)和復(fù)用。
- 導(dǎo)出報(bào)告時(shí)使用多個(gè)工作表,讓明細(xì)和統(tǒng)計(jì)結(jié)果分開(kāi)。
總結(jié)
pandas 非常適合 Python 辦公自動(dòng)化方向的 Excel 數(shù)據(jù)分析任務(wù)。它既能完成基礎(chǔ)的讀取、篩選、排序、缺失值處理,也能像 Excel 透視表一樣做分組統(tǒng)計(jì),還可以把清洗后的明細(xì)和統(tǒng)計(jì)結(jié)果導(dǎo)出為新的 Excel 報(bào)告。
當(dāng)你的工作中出現(xiàn)“每天都要處理類似 Excel”“人工篩選容易出錯(cuò)”“統(tǒng)計(jì)口徑需要固定下來(lái)”這類需求時(shí),就很適合用 pandas 寫成自動(dòng)化腳本。這樣不僅能提高效率,也能讓數(shù)據(jù)處理過(guò)程更透明、更可復(fù)用。
以上就是基于Python+pandas實(shí)現(xiàn)Excel數(shù)據(jù)統(tǒng)計(jì)分析自動(dòng)化完整指南的詳細(xì)內(nèi)容,更多關(guān)于Python Excel數(shù)據(jù)統(tǒng)計(jì)分析自動(dòng)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 正則表達(dá)式 re.match/re.search/re.sub的使用解析
今天小編就為大家分享一篇Python 正則表達(dá)式 re.match/re.search/re.sub的使用解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
python讀取json數(shù)據(jù)還原表格批量轉(zhuǎn)換成html
這篇文章主要介紹了python讀取json數(shù)據(jù)還原表格批量轉(zhuǎn)換成html,由于需要對(duì)ocr識(shí)別系統(tǒng)的表格識(shí)別結(jié)果做驗(yàn)證,通過(guò)返回的json文件結(jié)果對(duì)比比較麻煩,故需要將json文件里面的識(shí)別結(jié)果還原為表格做驗(yàn)證,下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-03-03
Python與xlwings黃金組合處理Excel各種數(shù)據(jù)和自動(dòng)化任務(wù)
這篇文章主要為大家介紹了Python與xlwings黃金組合處理Excel各種數(shù)據(jù)和自動(dòng)化任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-12-12
Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼
這篇文章主要介紹了Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Python Process創(chuàng)建進(jìn)程的2種方法詳解
這篇文章主要介紹了Python Process創(chuàng)建進(jìn)程的2種方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Python多線程經(jīng)典問(wèn)題之乘客做公交車算法實(shí)例
這篇文章主要介紹了Python多線程經(jīng)典問(wèn)題之乘客做公交車算法,簡(jiǎn)單描述了乘客坐公交車問(wèn)題并結(jié)合實(shí)例形式分析了Python多線程實(shí)現(xiàn)乘客坐公交車算法的相關(guān)技巧,需要的朋友可以參考下2017-03-03
在pytorch中為Module和Tensor指定GPU的例子
今天小編就為大家分享一篇在pytorch中為Module和Tensor指定GPU的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
python如何實(shí)現(xiàn)MK突變檢驗(yàn)方法,代碼復(fù)制修改可用
這篇文章主要介紹了python如何實(shí)現(xiàn)MK突變檢驗(yàn)方法,代碼復(fù)制修改可用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
使用 Python 的 pprint庫(kù)格式化和輸出列表和字典的方法
pprint是"pretty-print"的縮寫,使用 Python 的標(biāo)準(zhǔn)庫(kù) pprint 模塊,以干凈的格式輸出和顯示列表和字典等對(duì)象,這篇文章主要介紹了如何使用 Python 的 pprint庫(kù)格式化和輸出列表和字典,需要的朋友可以參考下2023-05-05

