本文介紹在數(shù)據(jù)分析中如何使用
pandas
進(jìn)行數(shù)據(jù)清洗,是 pandas 學(xué)習(xí)階段的
重點(diǎn)
,沒(méi)有之一。
一、重復(fù)值檢測(cè)
pandas中用于重復(fù)值檢測(cè)的是
duplicated()
函數(shù),可以用于檢測(cè)行或列是否前后重復(fù),返回值是bool
類型。True 表示重復(fù),F(xiàn)alse 表示不重復(fù)。
函數(shù)參數(shù):
-
keep
:默認(rèn)情況下 keep = first ,表示第一行不重復(fù),后面的行參照第一行,取值還有last
(認(rèn)為最后一行不重復(fù)),False
(標(biāo)記所有重復(fù)行)。 -
subset
:只檢測(cè)某些列是否重復(fù),值是一個(gè)列表。
首先導(dǎo)入必要的包,并定義一個(gè)用于構(gòu)建 dataframe 對(duì)象的函數(shù):
import numpy as np
import pandas as pd
# 定義生成 dataframe 對(duì)象的函數(shù)
def make_df(indexs,columns):
data = [[str(j)+str(i) for j in columns] for i in indexs]
df = pd.DataFrame(data=data,index=indexs,columns=columns)
return df
df = make_df(list('123'),list('ABC'))
df
下面演示 duplicated()
函數(shù)以及參數(shù)的使用:
# 讓第一行和第二行一樣
df.loc['1'] = df.loc['2']
df
df.duplicated()
等價(jià)寫(xiě)法:
df.duplicated(keep='first')
以最后一行為不重復(fù)參照:
df.duplicated(keep='last')
標(biāo)記所有重復(fù)行:
df.duplicated(keep=False)
只檢查 B、C
列:
df.duplicated(subset=['B','C'])
二、元素替換
1?? 元素替換replace
replace 函數(shù)用于替換單個(gè)的元素。
首先構(gòu)建 dataframe 對(duì)象:(本文后面用到的 dataframe 對(duì)象都是這個(gè),只是數(shù)據(jù)是隨機(jī)產(chǎn)生的,和我的肯定不同,但是不重要)
index = ['張三','張三豐','李白','杜甫']
columns = ['Python','Java','H5','UI']
data = np.random.randint(0,100,(4,4))
df = pd.DataFrame(data=data,index=index,columns=columns)
df
將1、11分別改為60,61:
df.replace({1:60,11:61})
2?? 數(shù)據(jù)映射map
map 一般用于
Series
結(jié)構(gòu),不能用于dataframe
,因此,我們?cè)谑褂?map
來(lái)處理 dataframe 對(duì)象時(shí),應(yīng)該取一個(gè) Series (列)。
如果對(duì) dataframe 對(duì)象使用 map 函數(shù)(不是下面的第一種情況):
df.map(lambda x:'及格' if x >= 60 else '不及格')
如果對(duì) Series 對(duì)象使用 map 函數(shù)(下面的2、3種情況):
df['Python'].map(lambda x:'及格' if x >= 60 else '不及格')
- 1.直接使用 map
現(xiàn)在將上面的4、18分別改為44,81:
df.map({4:44,18:81})
- 2.使用 lambda 表達(dá)式
現(xiàn)在使用 lambda 表達(dá)式篩選 Python 成績(jī),分為及格和不及格。
df['Python'].map(lambda x:'及格' if x >= 60 else '不及格')
- 3.使用普通函數(shù)
使用普通函數(shù),即為 map 函數(shù)傳遞一個(gè)函數(shù)名:
# 使用普通函數(shù)
def fn(x):
if x >= 60:
return '及格'
return '不及格'
df['UI'].map(fn)
三、修改索引
1?? 修改索引名rename
使用
pd.rename()
函數(shù)可以修改索引,默認(rèn)是修改行索引,傳遞字典。
使用 rename 函數(shù)修改行索引:
df.rename({'張三':'ZhangSan'})
如果要修改列索引,要使用 axis = 1
指定:
df.rename({'Python':'派森'},axis=1)
或者使用 columns
參數(shù):
df.rename(columns={'Java':'爪哇'})
結(jié)果如下:
修改行索引還是修改列索引,可以通過(guò)
axis
控制,也可以使用index 、 columns
參數(shù)控制。
2?? 設(shè)置索引和重置索引
pandas中
set_index()
函數(shù)用于將 keys 參數(shù)中指定的列索引變?yōu)樾兴饕?/p>
接下來(lái)使用 set_index() 修改列索引 Python 為行索引:
df.set_index(keys=['Python'])
函數(shù)參數(shù):
-
keys
:列表類型,用于指定要更改的列。 -
drop
:bool 類型,默認(rèn)為T(mén)rue,表示列改為行索引后,刪除原來(lái)的列。 -
append
:bool 列行,默認(rèn)為False,表示不追加,刪除原來(lái)的行索引。
重置行索引使用
reset_index
函數(shù),重置列索引使用的是df.columns
重新賦值。
分別重置行索引和列索引:
df.columns = ['1','2','3','4']
df
四、數(shù)據(jù)處理
apply、applymap、transform
都是用于數(shù)據(jù)處理的函數(shù),其中 applymap 只適用于處理 dataframe ,apply 和 transform 適用于處理 Series 和 DataFrame 。
1?? apply與applymap
apply 應(yīng)用于Series:
df['Python'].apply(lambda x: True if x > 60 else False)
apply 應(yīng)用于DataFrame(求每一列的平均值):
df.apply(lambda x:x.mean())
也可以傳遞一個(gè)函數(shù),并控制計(jì)算行或列:
def fn(x):
return (x.mean(),x.count())
df.apply(fn,axis=1)
applymap 處理 dataframe :
# 處理Series報(bào)錯(cuò)
df['Python'].applymap(lambda x:x*10)
# 處理dataframe不報(bào)錯(cuò)
df.applymap(lambda x:x*10)
2?? transform
transform 處理 Series(計(jì)算Python列的平方根):
df['Python'].transform(np.sort)
transform 處理 DataFrame(平均值大于6就除以6):
def fn(x):
if x.mean() > 6:
return x / 6
return x
df.transform(fn)
五、異常值處理
這部分的內(nèi)容,主要介紹8個(gè)常用函數(shù)的用法,為了防止圖片過(guò)多,部分實(shí)際運(yùn)行結(jié)果已省略。
describe()
describe函數(shù)用于查看 dataframe 對(duì)象的列數(shù),平均值,標(biāo)準(zhǔn)差,最小值、最大值、平均值等。
# 構(gòu)建dataframe對(duì)象
data = np.random.randint(0,10,(5,3))
df = pd.DataFrame(columns=['NumPy','Pandas','Pytorch'],data=data)
df
df.describe()
查看更細(xì)致的百分位數(shù),并且轉(zhuǎn)置:
df.describe([0.01,0.33,0.99]).T
info()、std()
info 函數(shù)用于查看數(shù)據(jù)類型、行列索引、每一列數(shù)據(jù)非空情況、類型、內(nèi)存使用情況等。
std() 函數(shù)用于求每一列的標(biāo)準(zhǔn)差。
df.info()
df.std()
drop()
drop 函數(shù)用于刪除索引??梢酝ㄟ^(guò) axis 或者 index / columns 控制刪除行索引還是列索引。
df2.drop(0) # 默認(rèn)刪除行
df2.drop(index=0) # 等價(jià)寫(xiě)法
df2.drop('NumPy',axis=1) # 刪除列
df2.drop(columns='NumPy') # 等價(jià)寫(xiě)法
df2.drop(columns=['NumPy','Pandas']) # 刪除多列
df2.drop(columns='NumPy',inplace=True) # 修改原數(shù)據(jù)
unique()
unique 函數(shù)用于去重,只能應(yīng)用于 Series 對(duì)象,不能用于 DataFrame 對(duì)象。
df['Pytorch'].unique()
query()
query 函數(shù)用于查詢特定的行。
df.query('Pandas == 6') # 查詢pandas = 6的行
df.query('Pytorch > 2') # 查詢Pytorch > 2的行
df.query('Pandas == 6 and Pytorch > 2' ) # 使用 and 符
n = 3
df.query('Pytorch > @n') # 使用變量
sort_values()
sort_values 函數(shù)作用是根據(jù)值對(duì)行或列進(jìn)行排序。
df.sort_values('Pandas') # 默認(rèn)列排序
df.sort_values('Pandas',ascending=False) # 降序
df.sort_values(0,axis=1) # 行排序
sort_index()
sort_index 函數(shù)用于對(duì)索引排序,數(shù)字按大小,非數(shù)字按 ASCII 碼。
df.sort_index() # 默認(rèn)對(duì)行索引排序(axis = 0),并且是升序(ascending = True)
df.sort_index(ascending=False) # 降序
df.sort_index(axis = 1,ascending=False) # 對(duì)列索引排序,并且降序
六、抽樣聚合函數(shù)
1?? 抽樣
pandas 中有兩種抽樣,分別是有放回抽樣(可能重復(fù))和無(wú)放回抽樣(不會(huì)重復(fù)),使用 take
函數(shù)抽取,下面使用代碼表示。
首先查看 dataframe 對(duì)象:
- 無(wú)放回抽樣
df.take([0,2,3,1,4]) # 交換行
運(yùn)行結(jié)果分別是:
df.take([0,2,1],axis=1) # 交換列
df.take(np.random.permutation([0,1,2,3,4])) # 隨機(jī)交換
- 有放回抽樣
df.take(np.random.randint(0,4,size=5))
2?? 數(shù)學(xué)函數(shù)
這里羅列出了一些常用的數(shù)學(xué)函數(shù),不再以代碼演示。
函數(shù)名 | 功能 |
---|---|
count | 非空值數(shù)量 |
max / min | 最大 / 小值 |
median / mean | 中位數(shù) / 平均數(shù) |
sum | 和 |
value_counts | 元素出現(xiàn)次數(shù) |
cumsum | 累加 |
cumprod | 累乘 |
std | 標(biāo)準(zhǔn)差 |
var | 方差 |
cov | 協(xié)方差 |
corr | 相關(guān)系數(shù) |
七、分組聚合
分組操作通過(guò)
groupby()
方法實(shí)現(xiàn),得到的是一個(gè)DataFrameGroupBy
對(duì)象,該對(duì)象與 DataFrame 類似,操作和 DataFrame 一樣即可。
下面結(jié)合例題講解 groupby 方法。
有如下 dataframe 對(duì)象:
df = pd.DataFrame(
data={
'item':['蘿卜','白菜','辣椒','冬瓜','白菜','辣椒','蘿卜','蘿卜'],
'color':['白色','青色','紅色','白色','白色','青色','紅色','青色'],
'weight':[1,0,3,4,5,2,12,3],
'price':[0.99,1.5,2,5,4,2,9,2]
}
)
df
- 1.求出顏色為白色的價(jià)格總和
# 要得到顏色為白色的所有行,首先要按照顏色進(jìn)行分組,通過(guò) by 參數(shù)指定
df.groupby(by='color')
# 接下來(lái)取出價(jià)格列(Series類型)
df.groupby(by='color')['price']
# 進(jìn)行求和
df.groupby(by='color')['price'].sum()
# 最后取出白色
df.groupby(by='color')['price'].sum()['白色']
- 2.分別求出蘿卜的總重量和平均價(jià)格
# (1)
# 首先按照item分類
df.groupby('item')
# 然后取出重量
df.groupby('item')['weight']
# 求和
df.groupby('item')['weight'].sum()
# 再取出蘿卜
df.groupby('item')['weight'].sum()['蘿卜']
#(2)
# 類似的,得到平均價(jià)格
df.groupby('item')['price'].mean()['蘿卜']
- 3.使用 merge 合并總重量和平均價(jià)格
因?yàn)樯鲜鋈〕?weight
和 price
后是 Series 對(duì)象,我們要稍作改變?yōu)?DataFrame 對(duì)象,才能使用 merge
進(jìn)行合并。
df1 = df.groupby('item')[['weight']].sum()
df2 = df.groupby('item')[['price']].mean()
display(df1,df2)
# 因?yàn)閮蓚€(gè) df 對(duì)象沒(méi)有相同列,合并時(shí)要使用 left / right_index
df1.merge(df2,left_index=True,right_index=True)
?? 文末福利
本期送出《Python機(jī)器學(xué)習(xí):基于PyTorch和Scikit-Learn》。
本書(shū)是一本全面介紹在PyTorch環(huán)境下學(xué)習(xí)機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的綜合指南
,可以作為初學(xué)者的入門(mén)教程,也可以作為讀者開(kāi)發(fā)機(jī)器學(xué)習(xí)項(xiàng)目時(shí)的參考書(shū)。
本書(shū)講解清晰、示例生動(dòng),深入介紹了機(jī)器學(xué)習(xí)方法的基礎(chǔ)知識(shí),不僅提供了構(gòu)建機(jī)器學(xué)習(xí)模型的說(shuō)明,而且提供了構(gòu)建機(jī)器學(xué)習(xí)模型和解決實(shí)際問(wèn)題的基本準(zhǔn)則。本書(shū)添加了基于PyTorch的深度學(xué)習(xí)內(nèi)容,介紹了新版Scikit-Learn。本書(shū)涵蓋了多種用于文本和圖像分類的機(jī)器學(xué)習(xí)與深度學(xué)習(xí)方法,介紹了用于生成新數(shù)據(jù)的生成對(duì)抗網(wǎng)絡(luò)(GAN)和用于訓(xùn)練智能體的強(qiáng)化學(xué)習(xí)。最后,本書(shū)還介紹了深度學(xué)習(xí)的新動(dòng)態(tài),包括圖神經(jīng)網(wǎng)絡(luò)和用于自然語(yǔ)言處理(NLP)的大型transformer。無(wú)論是機(jī)器學(xué)習(xí)入門(mén)新手,還是計(jì)劃跟蹤機(jī)器學(xué)習(xí)進(jìn)展的研發(fā)人員,都可以將本書(shū)作為使用Python進(jìn)行機(jī)器學(xué)習(xí)的不二之選。
學(xué)完本書(shū),你將能夠:
-
探索機(jī)器從數(shù)據(jù)中“學(xué)習(xí)”的框架、模型和方法。
-
使用Scikit-Learn實(shí)現(xiàn)機(jī)器學(xué)習(xí),使用PyTorch實(shí)現(xiàn)深度學(xué)習(xí)。
-
訓(xùn)練機(jī)器學(xué)習(xí)分類器分類圖像、文本等數(shù)據(jù)。
-
構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)、transformer及圖神經(jīng)網(wǎng)絡(luò)。
-
探索評(píng)估和優(yōu)化模型的最佳方法。
-
使用回歸分析預(yù)測(cè)連續(xù)目標(biāo)結(jié)果。
-
使用情感分析深入地挖掘文本和社交媒體數(shù)據(jù)。
?? 點(diǎn)這里去往:購(gòu)買(mǎi)鏈接
?? 本次送書(shū)1~5
本【閱讀量越多,送的越多】
?? 活動(dòng)時(shí)間:截止到2023-08-8 10:00
?? 參與方式: 關(guān)注博主+三連(點(diǎn)贊、收藏、評(píng)論)(切記要點(diǎn)贊+收藏,否則抽獎(jiǎng)無(wú)效)
?? 抽獎(jiǎng)方式: 評(píng)論區(qū)隨機(jī)抽取小伙伴免費(fèi)送出?。?mark hidden color="red">文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-623573.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-623573.html
到了這里,關(guān)于【玩轉(zhuǎn)pandas系列】數(shù)據(jù)清洗(文末送書(shū))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!