一文帶你掌握Python Pandas數(shù)據(jù)處理的三大實(shí)用技巧
同樣我們使用上節(jié)課的 DATA.xlsx 文件,來(lái)進(jìn)行本節(jié)課的演示,數(shù)據(jù)如下:

一、如何對(duì)DataFrame新增列
1.1 直接運(yùn)算實(shí)現(xiàn)
我們新增一個(gè)“業(yè)績(jī)總分” 列,為“銷(xiāo)售數(shù)量” 乘以 “客戶(hù)評(píng)分”
print(df.head(3))
df.loc[:,"業(yè)績(jī)總分"] = df["銷(xiāo)售數(shù)量"] * df["客戶(hù)評(píng)分"]
print("="*60)
print(df.head(3))
輸出如下,可以發(fā)現(xiàn)運(yùn)算過(guò)后,最后多了一列業(yè)績(jī)總分,也就是成功新增了一列:

1.2 Apply方法增加列
apply方法的直接使用用法是這樣,這里我們通過(guò)performance函數(shù)接受df,然后進(jìn)行判斷,根據(jù)不同的安全等級(jí)劃分性能
def performance(df):
if df["安全等級(jí)"] == "A" or df["安全等級(jí)"] == "B":
return "好"
elif df["安全等級(jí)"] == "C" or df["安全等級(jí)"] == "D":
return "一般"
# axis=1 表示一行一行處理數(shù)據(jù), 如果是一列一列處理數(shù)據(jù)的話就是 axis=0
df.loc[:,"性能"] = df.apply(performance,axis=1)
print(df.head(3))
輸出結(jié)果如下,可以看到通過(guò)apply方法,我們也成功增加了一列性能:
產(chǎn)品經(jīng)理 產(chǎn)品類(lèi)別 地區(qū) 安全等級(jí) 銷(xiāo)售額(元) 銷(xiāo)售數(shù)量 客戶(hù)評(píng)分 性能
出庫(kù)日期
2023-06-01 Jerry 電子產(chǎn)品 西南 C 3789.6 12 5.0 一般
2023-06-02 Cary 服裝 華東 A 2345.3 14 5.0 好
2023-06-03 Bob-Smith 家居用品 西北 D 567.8 7 3.7 一般
還可以順手通過(guò)value_counts()方法統(tǒng)計(jì)一下結(jié)果:
print(df["性能"].value_counts()) # 統(tǒng)計(jì)不同性能情況的個(gè)數(shù)
如果python基礎(chǔ)好的話,還可以通過(guò)推導(dǎo)式,簡(jiǎn)化一下函數(shù)的寫(xiě)法:
df["性能"] = df["安全等級(jí)"].apply(lambda x: "好" if x in ["A","B"] else "一般")
同時(shí)發(fā)現(xiàn)apply方法有一個(gè)axis參數(shù),表示傳入進(jìn)來(lái)的df是按行,還是按列,如果為1,代表為行,其實(shí)打印出來(lái)就發(fā)現(xiàn)

結(jié)構(gòu)其實(shí)是上面這樣子,因此可以通過(guò)df["XXXX"] 的形式取出來(lái)做判斷,然后再返回一個(gè)結(jié)果,如果axis=0,那代表的就是按列傳遞,其實(shí)每此傳遞都是 一列索引+一列數(shù)據(jù) 的格式,這種情況下我們可以對(duì)每列的數(shù)據(jù)做分析,結(jié)構(gòu)如下:

1.3 Assign方法
同時(shí)我們也可以使用Assign方法得到一樣的結(jié)果,下面不管是 map 還是多加的[ ],都是為了將數(shù)據(jù)一行一行取出來(lái),具體map和apply 這些方法怎么用,我會(huì)在最后一節(jié),附錄中給出來(lái)
# 第一種寫(xiě)法 df = df.assign(性能 = df["安全等級(jí)"].map(lambda x: "好" if x in ["A", "B"] else "一般")) # 第二種寫(xiě)法 df = df.assign(性能 = lambda x: ["好" if x in ["A", "B"] else "一般" for x in df["安全等級(jí)"]]) print(df.head(3))
因此我們可以得到結(jié)果是:
產(chǎn)品經(jīng)理 產(chǎn)品類(lèi)別 地區(qū) 安全等級(jí) 銷(xiāo)售額(元) 銷(xiāo)售數(shù)量 客戶(hù)評(píng)分 性能
出庫(kù)日期
2023-06-01 Jerry 電子產(chǎn)品 西南 C 3789.6 12 5.0 一般
2023-06-02 Cary 服裝 華東 A 2345.3 14 5.0 好
2023-06-03 Bob-Smith 家居用品 西北 D 567.8 7 3.7 一般
1.3 通過(guò)條件語(yǔ)句進(jìn)行新增列
在下面的代碼中,我們先通過(guò) df["性能"] = "" 初始化一個(gè)空列,然后依次賦值,可以得到一樣的結(jié)果:
df["性能"] = "" # 先初始化一個(gè)空列 df.loc[df["安全等級(jí)"].isin(["A","B"]),"性能"] = "好" df.loc[df["安全等級(jí)"].isin(["C","D"]),"性能"] = "一般" print(df.head(3))
二、pandas常見(jiàn)的數(shù)據(jù)統(tǒng)計(jì)類(lèi)型
2.1 數(shù)據(jù)特征統(tǒng)計(jì)
pandas提供了非常強(qiáng)大的數(shù)據(jù)統(tǒng)計(jì)功能,比如去重,計(jì)數(shù)以及對(duì)數(shù)據(jù)特征做匯總,比如我們先簡(jiǎn)單使用這樣一句代碼:
print(df.describe()) # 描述性統(tǒng)計(jì)
描述性統(tǒng)計(jì)用于數(shù)據(jù)中的數(shù)值列計(jì)數(shù),求平均值,標(biāo)準(zhǔn)差,最小最大值和各個(gè)分位數(shù)
銷(xiāo)售額(元) 銷(xiāo)售數(shù)量 客戶(hù)評(píng)分
count 606.000000 606.000000 606.000000
mean 1381.760479 7.120462 4.327723
std 868.101509 3.309942 0.390114
min 345.600000 2.000000 3.500000
25% 745.600000 5.000000 4.000000
50% 987.600000 6.000000 4.300000
75% 1876.400000 8.000000 4.600000
max 4567.900000 21.000000 5.000000
當(dāng)然如果你只想要查看某個(gè)字段的具體指標(biāo)的話,可以通過(guò)單獨(dú)打印實(shí)現(xiàn):
print(df["銷(xiāo)售額(元)"].max()) # 最大銷(xiāo)售額 print(df["銷(xiāo)售額(元)"].min()) # 最小銷(xiāo)售額 print(df["銷(xiāo)售額(元)"].mean()) # 平均銷(xiāo)售額 print(df["銷(xiāo)售額(元)"].median()) # 中位數(shù)銷(xiāo)售額 print(df[["銷(xiāo)售額(元)","銷(xiāo)售數(shù)量"]].cov()) # 協(xié)方差矩陣 print(df[["銷(xiāo)售額(元)","銷(xiāo)售數(shù)量"]].corr()) # 相關(guān)系數(shù)矩陣
2.2 數(shù)據(jù)去重和分類(lèi)匯總
通過(guò) unique方法 我們能拿到去重之后的結(jié)果,返回的是一個(gè)列表,而通過(guò) value_counts 我們能拿到各個(gè)子類(lèi)的結(jié)果
print(df["安全等級(jí)"].unique())
print(df["安全等級(jí)"].value_counts())
print("="*60) # 分割線
print(df["地區(qū)"].unique())
print(df["地區(qū)"].value_counts())
輸出的結(jié)果如下:
['C' 'A' 'D' 'B']
安全等級(jí)
C 175
A 147
B 146
D 138
Name: count, dtype: int64
============================================================
['西南' '華東' '西北' '華北' '華南' '華中']
地區(qū)
華東 102
西南 101
華北 101
華南 101
華中 101
西北 100
Name: count, dtype: int64
三、pandas對(duì)缺失值的處理
我們有一個(gè)這樣的EXCEL文件,名為 DATA_part.xlsx,如圖所示,這個(gè)數(shù)據(jù)很不規(guī)范,有以下幾個(gè)典型特征:
- A1單元格為空,真正的數(shù)值前有空行空列
- 存在合并單元格
- 數(shù)據(jù)源中也存在空行

3.1 判斷是否為空值
首先我們讀取這個(gè)EXCEL,使用skiprows 跳過(guò)第一行
file_path = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)DATA_part.xlsx" df = pd.read_excel(file_path,skiprows=1) # 跳過(guò)第一行
得到如下的結(jié)果,可以發(fā)現(xiàn)沒(méi)有填充數(shù)據(jù)的部分都是NaN,因此我們需要對(duì)數(shù)據(jù)進(jìn)行清洗
Unnamed: 0 產(chǎn)品經(jīng)理 地區(qū) 銷(xiāo)售數(shù)量 客戶(hù)評(píng)分
0 NaN Jerry 西南 12.0 5.0
1 NaN NaN 華東 14.0 5.0
2 NaN NaN 西北 7.0 3.7
3 NaN NaN NaN NaN NaN
4 NaN Cary 西南 17.0 NaN
5 NaN NaN 華東 19.0 10.0
6 NaN NaN 西北 12.0 8.7
7 NaN Bob-Smith 西南 15.0 8.0
8 NaN NaN 華東 17.0 8.0
9 NaN NaN 西北 10.0 6.7
首先我們通過(guò)isnull來(lái)判斷是否是空值,注意兩層sum才是對(duì)整個(gè)區(qū)域的缺失值求和
print(df.isnull()) # 打印缺失值
print("="*60) # 分割線
print(df.isnull().sum()) # 查看缺失值數(shù)量
print("="*60) # 分割線
print(df.isnull().sum().sum()) # 查看缺失值總數(shù)
得到如下結(jié)果:
Unnamed: 0 產(chǎn)品經(jīng)理 地區(qū) 銷(xiāo)售數(shù)量 客戶(hù)評(píng)分
0 True False False False False
1 True True False False False
2 True True False False False
3 True True True True True
4 True False False False True
5 True True False False False
6 True True False False False
============================================================
Unnamed: 0 7
產(chǎn)品經(jīng)理 5
地區(qū) 1
銷(xiāo)售數(shù)量 1
客戶(hù)評(píng)分 2
dtype: int64
============================================================
16
同樣如果我們需要統(tǒng)計(jì)非空值,那就使用notnull方法。
3.2 丟棄空行空列
在這里我們需要使用dropna方法,里面主要有三個(gè)參數(shù):
axis=1, 代表按列方向,axis=0, 代表按行方向how="all"代表這個(gè)維度所有的為空才刪除,how="any"代表只要有空值就刪除inplace=True代表替換原來(lái)的DataFrame,否則不替換
df.dropna(axis=1,how="all",inplace=True) # 按列刪除缺失值 df.dropna(axis=0,how="all",inplace=True) # 按行刪除缺失值
執(zhí)行以上過(guò)程后,得到稍微干凈一點(diǎn)的數(shù)據(jù):
產(chǎn)品經(jīng)理 地區(qū) 銷(xiāo)售數(shù)量 客戶(hù)評(píng)分
0 Jerry 西南 12.0 5.0
1 NaN 華東 14.0 5.0
2 NaN 西北 7.0 3.7
4 Cary 西南 17.0 NaN
5 NaN 華東 19.0 10.0
6 NaN 西北 12.0 8.7
3.3 空值填充
接下來(lái)我們就需要對(duì)剩余的空值進(jìn)行處理,規(guī)范的DataFrame其實(shí)就是行和列每個(gè)位置都有有效的數(shù)據(jù),因此我們通過(guò)fillna方法將其進(jìn)行填充,其重要的主要有3個(gè)參數(shù):
value, 代表你要將空值填為什么,比如對(duì)于客戶(hù)評(píng)分列就很適合這種填充method="ffill"代表用空值之前的內(nèi)容填充,比如產(chǎn)品經(jīng)理列就很適合,同樣bfill代表用空值后續(xù)的值填充inplace=True代表替換原來(lái)的DataFrame,否則不替換
df["客戶(hù)評(píng)分"].fillna(value=0,inplace=True) # 填充缺失值 df["產(chǎn)品經(jīng)理"].fillna(method="ffill",inplace=True) # 填充缺失值
經(jīng)過(guò)這樣處理之后,得到的結(jié)果為:
產(chǎn)品經(jīng)理 地區(qū) 銷(xiāo)售數(shù)量 客戶(hù)評(píng)分
0 Jerry 西南 12.0 5.0
1 Jerry 華東 14.0 5.0
2 Jerry 西北 7.0 3.7
4 Cary 西南 17.0 0.0
5 Cary 華東 19.0 10.0
6 Cary 西北 12.0 8.7
這樣子我們?cè)僦苯訉?xiě)到另一個(gè)工作簿,就非常完美了,但是要注意使用index=False,防止將DataFrame的索引列也寫(xiě)回。
df.to_excel(r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)DATA_part_clean.xlsx",index=False) # 保存到新文件
我們打開(kāi)保存之后的DATA_part_clean.xlsx文件,就發(fā)現(xiàn)清洗后的數(shù)據(jù)已經(jīng)放在表格內(nèi)了

附錄:Apply,Map,ApplyMap的使用差異
在下面的案例中,我們需要將 "A":"區(qū)域A","B":"區(qū)域B","C":"區(qū)域C" 做一個(gè)一一替換,使用了四種不同的方式,都能得到最后的結(jié)果:
apply方法,結(jié)合lambda函數(shù),取出字典中的值,然后寫(xiě)回applymap方法,遍歷整個(gè)DataFrame,發(fā)現(xiàn)有符合的鍵,則進(jìn)行相應(yīng)的值替換,但是需要注意此方法只適用于DataFramemap方法,既可以支持DataFrame又可以支持Seriesreplace方法,取出對(duì)應(yīng)的列索引,然后進(jìn)行字典替換
import pandas as pd
import numpy as np
import random
np.random.seed(42) # 固定隨機(jī)數(shù)種子
random.seed(42)
df = pd.DataFrame({
"name":np.random.choice(["John","Doe","Jane"],20),
"area":np.random.choice(["A","B","C"],20),
"spend":np.random.randint(18,60,20),
"perf":np.random.randint(1,100,20)
})
print(df.head(3))
print("="*30)
map_dict = {"A":"區(qū)域A","B":"區(qū)域B","C":"區(qū)域C"}
df["area"] = df["area"].apply(lambda x:map_dict[x]) # 采用apply方法進(jìn)行替換
df = df.applymap(lambda x:map_dict[x] if x in map_dict else x) # 使用applymap方法進(jìn)行替換
# df["area"] = df["area"].applymap(lambda x:map_dict[x]) # 這樣寫(xiě)是錯(cuò)的,applymap只能對(duì)DataFrame生效
df["area"] = df["area"].map(map_dict) # 使用map方法進(jìn)行替換,對(duì)Series進(jìn)行替換
df = df.map(lambda x:map_dict[x] if x in map_dict else x) # 對(duì)整個(gè)DataFrame進(jìn)行替換
df = df.replace({"area":map_dict}) # 采用replace方法替換area列的A、B、C
print(df.head(3))
上述幾種方法得到的結(jié)果都是,實(shí)現(xiàn)了對(duì)指定列的替換:
name area spend perf
0 Jane A 54 50
1 John A 24 4
2 Jane B 38 2
==============================
name area spend perf
0 Jane 區(qū)域A 54 50
1 John 區(qū)域A 24 4
2 Jane 區(qū)域B 38 2
到此這篇關(guān)于一文帶你掌握Python Pandas數(shù)據(jù)處理的三大實(shí)用技巧的文章就介紹到這了,更多相關(guān)Python Pandas數(shù)據(jù)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python Pandas實(shí)現(xiàn)大數(shù)據(jù)處理的性能優(yōu)化技巧
- 一文詳解Python Pandas中67個(gè)最常用的數(shù)據(jù)處理函數(shù)
- Pandas中DataFrame進(jìn)行數(shù)據(jù)處理的完整指南
- 20個(gè)Python中pandas數(shù)據(jù)處理的高級(jí)技巧
- 一文詳解Pandas時(shí)間數(shù)據(jù)處理技巧
- Pandas進(jìn)行文本數(shù)據(jù)處理的全面指南
- pandas的空數(shù)據(jù)處理方式
- Python數(shù)據(jù)處理Pandas庫(kù)的使用詳解
相關(guān)文章
Python編程之event對(duì)象的用法實(shí)例分析
這篇文章主要介紹了Python編程之event對(duì)象的用法,結(jié)合實(shí)例形式分析了event對(duì)象在線程通信中的作用與使用方法,需要的朋友可以參考下2017-03-03
Python經(jīng)典五人分魚(yú)實(shí)例講解
在本篇文章里小編給大家分享的是一篇關(guān)于Python 五人分魚(yú)的經(jīng)典小游戲?qū)嵗齼?nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01
python 將數(shù)據(jù)保存為excel的xls格式(實(shí)例講解)
下面小編就為大家分享一篇python 將數(shù)據(jù)保存為excel的xls格式(實(shí)例講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Python獲取網(wǎng)頁(yè)時(shí)報(bào)HTTP 403錯(cuò)誤(禁止訪問(wèn))的解決辦法
這篇文章主要為大家詳細(xì)介紹了Python使用庫(kù)獲取網(wǎng)頁(yè)時(shí)報(bào)HTTP 403錯(cuò)誤(禁止訪問(wèn))的解決辦法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2025-12-12
Python3多模式匹配問(wèn)題的實(shí)現(xiàn)
Aho-Corasick是一種高效的多模式字符串匹配算法,適用于敏感詞檢測(cè)、文本過(guò)濾等,本文就來(lái)介紹一下Python3多模式匹配,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
Django框架登錄加上驗(yàn)證碼校驗(yàn)實(shí)現(xiàn)驗(yàn)證功能示例
這篇文章主要介紹了Django框架登錄加上驗(yàn)證碼校驗(yàn)實(shí)現(xiàn)驗(yàn)證功能,結(jié)合實(shí)例形式分析了Django框架基于Pillow模塊的圖形驗(yàn)證碼生成與使用相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
基于Python實(shí)現(xiàn)格斗小游戲的示例代碼
格斗游戲,曾經(jīng)是街機(jī)廳里最火爆的游戲之一,甚至可以把“之一”去掉,那個(gè)年代的格斗游戲就是街機(jī)游戲的王。本文就來(lái)用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的格斗游戲,感興趣的可以了解一下2023-03-03

