Pandas進(jìn)階指南之?dāng)?shù)據(jù)合并與缺失值處理詳解
本節(jié)課,我們將學(xué)習(xí)數(shù)據(jù)清洗(處理缺失值)、多表關(guān)聯(lián)合并(Python版的VLOOKUP),以及如何用一行代碼生成數(shù)據(jù)透 視表。
數(shù)據(jù)清洗:處理缺失數(shù)據(jù) (NaN)
從系統(tǒng)導(dǎo)出的數(shù)據(jù)經(jīng)常會(huì)遇到空白單元格,pandas 會(huì)將其識(shí)別為 NaN (Not a Number)。在分析前,我們必須妥善處理這些空值。
import pandas as pd
df = pd.read_excel("messy_data.xlsx")
# 1. 查看哪些列有缺失值
print(df.isnull().sum())
# 2. 刪除含有缺失值的行
# 如果某行只要有空值就整行刪除
df_dropped = df.dropna()
# 只有當(dāng)"銷售額"這一列為空時(shí),才刪除該行
df_dropped_subset = df.dropna(subset=["銷售額"])
# 3. 填充缺失值
# 將所有空值填充為 0
df_filled_0 = df.fillna(0)
# 針對(duì)不同列填充不同的值:數(shù)值列填0,文本列填"未知"
df_filled = df.fillna({"銷售額": 0, "部門": "未知部門"})
多表合并(Merge):碾壓 VLOOKUP
在Excel中,如果我們要根據(jù)“工號(hào)”把兩張表的數(shù)據(jù)匹配到一起,通常會(huì)用到 VLOOKUP 公式。如果數(shù)據(jù)量大,VLOOKUP會(huì)非??ā6?pandas 中,merge() 函數(shù)可以瞬間完成萬級(jí)數(shù)據(jù)的匹配。
假設(shè)我們有兩張表:
df_emp: 包含 [工號(hào), 姓名, 部門ID]df_dept: 包含 [部門ID, 部門名稱, 部門負(fù)責(zé)人]
df_emp = pd.read_excel("employees.xlsx")
df_dept = pd.read_excel("departments.xlsx")
# 使用 merge 進(jìn)行關(guān)聯(lián)匹配
# on="部門ID" 表示依據(jù)這一列進(jìn)行匹配
# how="left" 表示以左表(df_emp)為基準(zhǔn),找不到的部門信息顯示為 NaN
merged_df = pd.merge(df_emp, df_dept, on="部門ID", how="left")
print(merged_df.head())
多表拼接(Concat):上下堆疊數(shù)據(jù)
每個(gè)月你都會(huì)收到一份格式相同的月度銷售表(1月.xlsx, 2月.xlsx…),你需要把它們匯總成一張年度大表。這時(shí)用 concat() 最合適。
df_jan = pd.read_excel("1月銷售.xlsx")
df_feb = pd.read_excel("2月銷售.xlsx")
# ignore_index=True 表示重新生成行索引(0,1,2...),忽略原來的行號(hào)
df_total = pd.concat([df_jan, df_feb], ignore_index=True)
制作數(shù)據(jù)透 視表(Pivot Table)
Excel 的數(shù)據(jù)透 視表功能極其強(qiáng)大,而在 pandas 中,同樣可以通過 pivot_table 輕松實(shí)現(xiàn)。
需求:統(tǒng)計(jì)每個(gè)城市(行)、每個(gè)部門(列)的平均銷售額。
# data: 要透 視的 DataFrame
# values: 要計(jì)算的數(shù)值列
# index: 對(duì)應(yīng)透 視表的“行”標(biāo)簽
# columns: 對(duì)應(yīng)透 視表的“列”標(biāo)簽
# aggfunc: 計(jì)算方式(默認(rèn)是均值 mean,這里我們用 sum 求和)
# fill_value=0: 如果透 視后有空缺,用0填充
pivot = pd.pivot_table(
df,
values="銷售額",
index="城市",
columns="部門",
aggfunc="sum",
fill_value=0
)
print(pivot)
# 將透 視表結(jié)果保存為Excel
pivot.to_excel("銷售數(shù)據(jù)透 視表.xlsx")將多個(gè) DataFrame 導(dǎo)出到同一個(gè) Excel 的不同 Sheet 頁
有時(shí)候我們希望把原始數(shù)據(jù)、匯總數(shù)據(jù)、透 視表放在同一個(gè) Excel 文件的不同標(biāo)簽頁中。
# 使用 ExcelWriter 上下文管理器
with pd.ExcelWriter("最終報(bào)告.xlsx") as writer:
df_total.to_excel(writer, sheet_name="全年明細(xì)", index=False)
merged_df.to_excel(writer, sheet_name="員工部門信息", index=False)
pivot.to_excel(writer, sheet_name="城市部門透 視表")
print("多Sheet報(bào)表導(dǎo)出成功!")知識(shí)擴(kuò)展
在 pandas 中,最核心的數(shù)據(jù)結(jié)構(gòu)叫做 DataFrame。你可以把它直接想象成 Excel 中的一張二維數(shù)據(jù)表,有行號(hào)(Index)和列名(Columns)。
讀取與保存 Excel 數(shù)據(jù)
pandas 讀取和保存數(shù)據(jù)的代碼極其簡潔,通常只需要一行代碼!
import pandas as pd
# 1. 讀取 Excel 文件
# 默認(rèn)讀取第一個(gè) Sheet 頁
df = pd.read_excel("sales_data.xlsx")
# 也可以指定讀取名為 '2023數(shù)據(jù)' 的 Sheet
# df = pd.read_excel("sales_data.xlsx", sheet_name="2023數(shù)據(jù)")
# 查看前5行數(shù)據(jù),快速了解數(shù)據(jù)概況
print(df.head())
# 查看數(shù)據(jù)的基本信息(行數(shù)、列數(shù)、數(shù)據(jù)類型、是否有缺失值)
print(df.info())
# 2. 將 DataFrame 保存為新的 Excel 文件
# index=False 表示不保存最左側(cè)的行索引號(hào)
df.to_excel("sales_data_backup.xlsx", index=False)
數(shù)據(jù)篩選:精準(zhǔn)定位你想要的數(shù)據(jù)
在Excel中,我們通常點(diǎn)擊表頭上的漏斗圖標(biāo)進(jìn)行篩選。在 pandas 中,我們通過“條件判斷”來實(shí)現(xiàn)。
假設(shè)我們的表中有:姓名, 部門, 銷售額, 城市 等列。
單條件篩選
找出所有“銷售部”的員工數(shù)據(jù):
sales_dept = df[df["部門"] == "銷售部"] print(sales_dept)
找出銷售額大于 10000 的記錄:
high_sales = df[df["銷售額"] > 10000]
多條件篩選
在 pandas 中,& 代表“且”(AND),| 代表“或”(OR)。注意:每個(gè)條件必須用括號(hào)括起來!
找出“銷售部” 且 “銷售額大于10000” 的數(shù)據(jù):
excellent_sales = df[(df["部門"] == "銷售部") & (df["銷售額"] > 10000)]
找出在“北京”或“上海”的員工數(shù)據(jù):
# 方法一:使用 | bj_sh_staff = df[(df["城市"] == "北京") | (df["城市"] == "上海")] # 方法二:使用 isin() 方法(推薦,更優(yōu)雅) bj_sh_staff = df[df["城市"].isin(["北京", "上海"])]
數(shù)據(jù)排序
類似Excel中的升序/降序功能,pandas 使用 sort_values() 方法。
# 按照銷售額從高到低排序(降序:ascending=False) sorted_df = df.sort_values(by="銷售額", ascending=False) # 多列排序:先按部門升序,部門相同的再按銷售額降序 sorted_multi = df.sort_values(by=["部門", "銷售額"], ascending=[True, False])
數(shù)據(jù)分組統(tǒng)計(jì) (GroupBy)
這是數(shù)據(jù)分析中最常用的功能之一!相當(dāng)于Excel中簡單版的數(shù)據(jù)透 視表。
需求:統(tǒng)計(jì)每個(gè)部門的總銷售額。
# 按“部門”分組,并對(duì)“銷售額”求和
dept_sales = df.groupby("部門")["銷售額"].sum()
# 重置索引,讓結(jié)果變成一個(gè)漂亮的 DataFrame
dept_sales_df = dept_sales.reset_index()
print(dept_sales_df)
需求:統(tǒng)計(jì)每個(gè)城市的員工人數(shù)、平均銷售額。
# 使用 agg 函數(shù)進(jìn)行多種聚合計(jì)算
city_stats = df.groupby("城市").agg({
"姓名": "count", # 計(jì)數(shù)(人數(shù))
"銷售額": "mean" # 求平均值
})
# 修改列名以便閱讀
city_stats.rename(columns={"姓名": "員工人數(shù)", "銷售額": "平均銷售額"}, inplace=True)
print(city_stats)
小結(jié)
通過本節(jié)課,你已經(jīng)掌握了數(shù)據(jù)分析中最核心的數(shù)據(jù)清洗、表關(guān)聯(lián)拼接和數(shù)據(jù)透 視功能。你手頭的武器庫已經(jīng)足夠應(yīng)對(duì) 80% 的日常數(shù)據(jù)處理需求了。
最后一節(jié)課,我們將結(jié)合 os 模塊,進(jìn)行一次酣暢淋漓的實(shí)戰(zhàn):一鍵自動(dòng)讀取上百個(gè)Excel文件,處理合并后自動(dòng)生成帶有格式的報(bào)表!
到此這篇關(guān)于Pandas進(jìn)階指南之?dāng)?shù)據(jù)合并、透 視表與缺失值處理詳解的文章就介紹到這了,更多相關(guān)Pandas數(shù)據(jù)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- pandas中數(shù)據(jù)缺失值的檢測(cè),統(tǒng)計(jì)與處理教學(xué)
- Pandas數(shù)據(jù)清洗之缺失值處理和重復(fù)值處理詳解
- 從缺失值到多層索引詳解Pandas數(shù)據(jù)清洗指南
- python?sklearn與pandas實(shí)現(xiàn)缺失值數(shù)據(jù)預(yù)處理流程詳解
- pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理)
- Pandas?DataFrame數(shù)據(jù)合并與連接的完整指南
- Pandas中數(shù)據(jù)合并的實(shí)現(xiàn)
- Pandas中數(shù)據(jù)表合并的幾種實(shí)現(xiàn)方法
- pandas數(shù)據(jù)合并與重塑之merge詳解
相關(guān)文章
Pycharm中配置Jupyter環(huán)境的圖文教程
本文主要介紹了Pycharm中配置Jupyter環(huán)境的圖文教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化
這篇文章主要介紹了Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化,Matplotlib?是?Python?中常用的?2D?繪圖庫,它能輕松地將數(shù)據(jù)進(jìn)行可視化,作出精美的圖表2022-08-08
詳解pyppeteer(python版puppeteer)基本使用
這篇文章主要介紹了詳解pyppeteer(python版puppeteer)基本使用 ,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Python中7刪除文件的7種方法實(shí)現(xiàn)與對(duì)比
本文提供了有關(guān)如何使用各種模塊和方法在Python中刪除文件的詳盡教程,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-09-09
Python使用Selenium進(jìn)行元素定位的步驟和方法
在使用Selenium進(jìn)行網(wǎng)頁自動(dòng)化測(cè)試時(shí),正確且高效地定位目標(biāo)元素是至關(guān)重要的,以下是詳細(xì)的步驟和方法,幫助你全面掌握如何使用Selenium進(jìn)行元素定位,需要的朋友可以參考下2025-06-06
Python中pygame的mouse鼠標(biāo)事件用法實(shí)例
這篇文章主要介紹了Python中pygame的mouse鼠標(biāo)事件用法,以完整實(shí)例形式詳細(xì)分析了pygame響應(yīng)鼠標(biāo)事件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
Python3實(shí)現(xiàn)打格點(diǎn)算法的GPU加速實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Python3實(shí)現(xiàn)打格點(diǎn)算法的GPU加速的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09
python 請(qǐng)求服務(wù)器的實(shí)現(xiàn)代碼(http請(qǐng)求和https請(qǐng)求)
本篇文章主要介紹了python 請(qǐng)求服務(wù)器的實(shí)現(xiàn)代碼(http請(qǐng)求和https請(qǐng)求),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05

