




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第pandas數(shù)據(jù)清洗(缺失值和重復(fù)值的處理)目錄前言缺失值處理缺失值的判斷缺失值統(tǒng)計(jì)缺失值篩選缺失值類型插入缺失值缺失值填充插值填充interpolate()的具體參數(shù)缺失值刪除缺失值刪除dropna重復(fù)值處理重復(fù)值查找刪除重復(fù)值drop刪除數(shù)據(jù)數(shù)據(jù)替換replace字符替換缺失值替換數(shù)字替換數(shù)據(jù)裁剪df.clip()
前言
pandas對(duì)大數(shù)據(jù)有很多便捷的清洗用法,尤其針對(duì)缺失值和重復(fù)值。缺失值就不用說了,會(huì)影響計(jì)算,重復(fù)值有時(shí)候可能并未帶來新的信息反而增加了計(jì)算量,所以有時(shí)候要進(jìn)行處理。針對(duì)一些文本數(shù)據(jù)可能不合要求的還要進(jìn)行替換什么的。
首先導(dǎo)入包:
importnumpyasnp
importpandasaspd
缺失值處理
一般使用特殊類型NaN代表缺失值,可以用Numpy可定義它np.NaN/np.nan。在Pandas1.0以后實(shí)驗(yàn)性地使用一個(gè)標(biāo)量pd.NA來代表。
如果想把正負(fù)無窮也為認(rèn)是缺失值,可以通過以下全局配置來設(shè)定:
pandas.options.mode.use_inf_as_na=True
#以下數(shù)據(jù)NaN為缺失值:
df=(pd.DataFrame(np.random.randn(5,3),index=['a','c','e','f','h'],columns=['one','two','three'])
.reindex(['a','b','c','d','e','f','g','h']))
df
缺失值的判斷
#不是缺失值
df.one.notna()
df.isna()#是缺失值
df[df.one.notna()]#進(jìn)行篩選
#需要注意的是,Numpy中np.nan和np.nan不相等,因此不能用==/!=進(jìn)行對(duì)比:
None==None#noqa:E711#True
np.nan==np.nan#False
None==np.nan#False
其他方法:
df.notna()
df['team'].isna()
df['team'].isnull()
缺失值統(tǒng)計(jì)
df.isnull().sum()#計(jì)算每列缺失值個(gè)數(shù)
df.isnull().sum(1)#計(jì)算每行缺失值個(gè)數(shù)
df.isnull().sum().sum()#總共缺失值個(gè)數(shù)
缺失值篩選
df.loc[df.isna().any(1)]#有缺失值的行
df.loc[:,df.isna().any()]#有缺失值的列
df.loc[~(df.isna().any(1))]#沒有缺失值的行
df.loc[:,~(df.isna().any())]#沒有缺失值的列
缺失值類型
#時(shí)間中的缺失值
#對(duì)于時(shí)間中的缺失值,Pandas提供了一個(gè)NaT來表示,并且NaT和NaN之間是兼容的:
df['timestamp']=pd.Timestamp('20120101')
df.loc[['a','c','h'],['one','timestamp']]=np.nan
df.timestamp
pd.Series([1,2,np.nan,4],dtype=pd.Int64Dtype())
插入缺失值
#可以使用None等方法將內(nèi)容修改為缺失值:
s.loc[0]=None
s.loc[1]=np.nan
df.two=pd.NA
缺失值填充
首先生成案例數(shù)據(jù):
df=pd.DataFrame([[np.nan,2,np.nan,0],
[3,4,np.nan,1],
[np.nan,np.nan,np.nan,5],
[np.nan,3,np.nan,4]],
columns=list('ABCD'))
df
fillna(x)可以將缺失值填充指定的值。以下為幾種常見的填充方法:
df.fillna(0)#填充為0
#填充為指定字符
df.fillna('missing')
df.fillna('暫無')
df.fillna('待補(bǔ)充')
df.one.fillna('暫無')#指定字段填充
df.one.fillna(0,inplace=Ture)#使填充內(nèi)容生效
df.fillna(0,limit=1)#只替換第一個(gè)
values={'A':0,'B':1,'C':2,'D':3}#不同列替換不同的值
df.fillna(value=values)
不指定值,使用一定的方法。
#使用method{‘backfill',‘bfill',‘pad',‘ffill',None},defaultNone
df.fillna(method='backfill')#使用上一個(gè)有效值填充
df.fillna(method='bfill')#同backfill
df.fillna(method='pad')#把當(dāng)前值廣播到后邊的缺失值
df.fillna(method='ffill')#同pad
#fillna(method='ffill')可以簡(jiǎn)寫為ffill(),fillna(method='bfill')可以簡(jiǎn)寫為bfill()
使用計(jì)算值填充:
#填充列的平均值
df.fillna(df.mean())
#對(duì)指定列填充平均值
df.fillna(df.mean()['B':'C'])
#填充列的平均值,另外一個(gè)方法
df.where(pd.notna(df),df.mean(),axis='columns')
#特別的計(jì)算:
#第一個(gè)非空值
df.fillna(method='bfill').head(1).iloc[0]
#第一個(gè)非空值索引
df.notna().idxmax()
df.apply(pd.Series.first_valid_index)
插值填充
插值方式,以下是一個(gè)非常簡(jiǎn)單的示例,其中一個(gè)值是缺失的,我們對(duì)它進(jìn)行差值:
s=pd.Series([0,1,4,9,np.nan,25])
erpolate()
9和25之間的中間點(diǎn)為17,就把缺失值補(bǔ)為了17,這是線性插值。
erpolate(method='spline',order=2)
這是二級(jí)多項(xiàng)式插值。用X^2這個(gè)函數(shù)去插值的,
interpolate()的具體參數(shù)
默認(rèn)linear方法,會(huì)認(rèn)為是一條直線。
計(jì)算方法:
默認(rèn)method=linear如果你的數(shù)據(jù)增長(zhǎng)速率越來越快,可以選擇method=quadratic二次插值。如果數(shù)據(jù)集呈現(xiàn)出累計(jì)分布的樣子,
推薦選擇method=pchip。如果需要填補(bǔ)缺省值,以平滑繪圖為目標(biāo),推薦選擇method=akima。method=akima和method=pchip,
需要你的環(huán)境中安裝了Scipy庫(kù)。除此之外,method=barycentric和method=pchip同樣也需要Scipy才能使用。
使用插值方法,可為:
linear:線性,忽略索引,并將值等距地對(duì)待,這是MultiIndexes支持的唯一方法time:時(shí)間,以插值給定的時(shí)間間隔長(zhǎng)度處理每日或更高粒度的數(shù)據(jù)index,values:索引,值,使用索引的實(shí)際數(shù)值pad:使用現(xiàn)有值填寫NaN。nearest,zero,slinear,quadratic,cubic,spline,barycentric,polynomial:傳遞給erp1d,這些方法使用索引的數(shù)值。polynomial和spline都要求您還指定一個(gè)順序(int),例如erpolate(method=polynomial,order=5)nearest:最近zero:零slinear:線性quadratic:二次方cubic:立方spline:花鍵,樣條插值barycentric:重心插值polynomial:多項(xiàng)式krogh,piecewise_polynomial,spline,pchip,akima:SciPy類似名稱的插值方法。krogh:克羅格插值piecewise_polynomial:分段多項(xiàng)式spline:樣條插值pchip:立方插值(累計(jì)分布)akima:阿克瑪插值(平滑繪圖)from_derivatives:指erpolate.BPoly.from_derivatives,它替換了scipy0.18中的piecewise_polynomial插值方法。
其他參數(shù):
axis:插值應(yīng)用的軸方向,可選擇{0orindex,1orcolumns,None},默認(rèn)為Nonelimitint:要填充的連續(xù)NaN的最大數(shù)量,必須大于0。inplace:是否將最終結(jié)果替換原數(shù)據(jù),默認(rèn)為Falselimit_direction:限制方向,可傳入{forward,backward,both},默認(rèn)forward,如果指定了限制,則將沿該方向填充連續(xù)的NaNlimit_area:限制區(qū)域,可傳入{None,inside,outside},默認(rèn)None,如果指定了限制,則連續(xù)的NaN將被此限制填充None:沒有填充限制inside:僅填充有效值包圍的NaN(內(nèi)插)outside:僅將NaN填充到有效值之外(外推)downcast:可傳入infer或者None,默認(rèn)是None,如果可以向下轉(zhuǎn)換dtypes**kwargs:傳遞給插值函數(shù)的關(guān)鍵字參數(shù)
缺失值刪除
生成案例數(shù)據(jù):
#一般刪除會(huì)針對(duì)行進(jìn)行,如一行中有缺失值就會(huì)刪除,當(dāng)然也會(huì)有針對(duì)列的。
df=pd.DataFrame({"name":['Alfred','Batman','Catwoman'],
"toy":[np.nan,'Batmobile','Bullwhip'],
"born":[pd.NaT,pd.Timestamp("1940-04-25"),
pd.NaT]})
df
缺失值刪除dropna
#刪除所有有缺失值的行(有一個(gè)缺失就刪除)
df.dropna()
#刪除所有有缺失值的列
df.dropna(axis='columns')
df.dropna(axis=1)
#刪除所有值都缺失的行
df.dropna(how='all')
#不足2個(gè)非空值時(shí)刪除
df.dropna(thresh=2)
#指定判斷缺失值的列范圍
df.dropna(subset=['name','born'])
#使刪除和的結(jié)果生效
df.dropna(inplace=True)
#指定列的缺失值刪除
df.toy.dropna()
重復(fù)值處理
重復(fù)值的尋找主要使用duplicated,語(yǔ)法為:
df.duplicated(subset=None,keep='first')
可以返回表示重復(fù)行的布爾系列,可以指定列。keep參數(shù)確定要標(biāo)記的重復(fù)項(xiàng)(如果有),選項(xiàng)有:
first:將除第一次出現(xiàn)的重復(fù)值標(biāo)記為True,默認(rèn)。last:將除最后一次出現(xiàn)的重復(fù)值標(biāo)記為True。False:將所有重復(fù)值標(biāo)記為True。
生成案例數(shù)據(jù):
df=pd.DataFrame({'brand':['YumYum','YumYum','Indomie','Indomie','Indomie'],
'style':['cup','cup','cup','pack','pack'],
'rating':[4,4,3.5,15,5]})
df
重復(fù)值查找
df.duplicated()
通過使用last,將每組重復(fù)值的最后一次出現(xiàn)設(shè)置為False,將所有其他重復(fù)值設(shè)置為True。
df.duplicated(keep='last')
df.duplicated(keep='last')
要在特定列上查找重復(fù)項(xiàng),請(qǐng)使用子集。
df.duplicated(keep=False)
刪除重復(fù)值
刪除重復(fù)值的語(yǔ)法為:
df.drop_duplicates(subset=None,
keep='first',
inplace=False,
ignore_index=False)
subset指定的標(biāo)簽或標(biāo)簽序列可選,僅刪除某些列重復(fù)項(xiàng),默認(rèn)情況為使用所有列,其他有:
keep:確定要保留的重復(fù)項(xiàng)(如果有)first:保留第一次出現(xiàn)的重復(fù)項(xiàng),默認(rèn)last:保留最后一次出現(xiàn)的重復(fù)項(xiàng)。False:刪除所有重復(fù)項(xiàng)inplac:False,是將副本放置在適當(dāng)位置還是返回副本ignore_inde:如果為True,則重新分配自然索引(0,1,,n-1)
df.drop_duplicates()
df.drop_duplicates(subset=['brand'])
df.drop_duplicates(subset=['brand','style'],keep='last')
drop刪除數(shù)據(jù)
語(yǔ)法
df.drop(labels=None,axis=0,index=None,columns=None,level=None,inplace=False,errors='raise')
labels表示要?jiǎng)h除的行或者列,多個(gè)可以傳入列表:
axis:表示軸方向,默認(rèn)0(行)index:指定一行或多行columns:指定列l(wèi)evel:指定多層索引inplace:立即修改
df.drop([2,4])#刪除指定行
df.drop(['brand','rating'],axis=1)#刪除指定列
df.drop(columns=['brand','rating'])#同上
數(shù)據(jù)替換replace
有時(shí)候想把數(shù)據(jù)替換為指定的值,空值缺失值都可以替換
#指定值替換,以下是在Series中將0替換為5:
ser=pd.Series([0.,1.,2.,3.,4.])
ser.replace(0,5)
#也可以批量替換:
#一一對(duì)應(yīng)進(jìn)行替換
ser.replace([0,1,2,3,4],[4,3,2,1,0])
#用字典映射對(duì)應(yīng)替換值
ser.replace({0:10,1:100})
#將a列的0b列中的5替換為100
df.replace({'a':0,'b':5},100)
#指定列里的替換規(guī)劃
df.replace({'a':{0:100,4:400}})
除了給定指定值進(jìn)行替換,我們還可以指定一些替換的方法:
#將1,2,3替換為它們前一個(gè)值(0)
ser.replace([1,2,3],method='pad')#ffill是它同義詞
#將1,2,3替換為它們后一個(gè)值(4)
ser.replace([1,2,3],method='bfill')
字符替換
#如果遇到字符比較復(fù)雜的內(nèi)容,就是使用正則(默認(rèn)沒有開啟)進(jìn)行匹配:
#把bat替換為new
df.replace(to_replace='bat',value='new')
#利用正則將ba開頭的替換為new
df.replace(to_replace=r'^ba.$',value='new',regex=True)
#如果多列規(guī)則不一的情況下可以按以下格式對(duì)應(yīng)傳入
df.replace({'A':r'^ba.$'},{'A':'new'},regex=True)
#多個(gè)規(guī)則替換為同一個(gè)值
df.replace(regex=[r'^ba.$','foo'],value='new')
#直接多個(gè)正則及對(duì)應(yīng)的替換內(nèi)容
df.replace(regex={r'^ba.$':'new','foo':'xyz'})
缺失值替換
替換可以處理缺失值相關(guān)的問題,如我們可以將無效的值先替換為nan,再做缺失值處理:
生成案例數(shù)據(jù)
d={'a':list(range(4)),
'b':list('ab..'),
'c':['a','b',np.nan,'d']}
df=pd.DataFrame(d)
df
一些用法:
#將.替換為nan,(也可以替換為None)
df.replace('.',np.nan)
#使用正則,將空格和點(diǎn)等替換為nan
df.replace(r'\s*\.\s*',np.nan,regex=True)
#對(duì)應(yīng)替換,a換b,點(diǎn)換nan
df.replace(['a','.'],['b',np.nan])
#點(diǎn)換dot,a換astuff(第一位+)
df.replace([r'\.',r'(a)'],['dot',r'\1stuff'],regex=True)
#b中的點(diǎn)要替換,替換為b替換規(guī)則為nan,可
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店倉(cāng)庫(kù)管理培訓(xùn)計(jì)劃
- 辭退違法解除協(xié)議書
- 餐廳安全合同協(xié)議書
- 遺產(chǎn)分割分配協(xié)議書
- 項(xiàng)目?jī)?nèi)部停工協(xié)議書
- 馬匹出售繁育協(xié)議書
- 設(shè)備合資購(gòu)買協(xié)議書
- 項(xiàng)目合作擔(dān)保協(xié)議書
- 風(fēng)冷電機(jī)訂購(gòu)協(xié)議書
- 落戶委托服務(wù)協(xié)議書
- GB/T 23703.3-2010知識(shí)管理第3部分:組織文化
- BD每月績(jī)效考核表
- GB/T 16535-1996工程陶瓷線熱膨脹系數(shù)試驗(yàn)方法
- 野生動(dòng)物馴養(yǎng)繁殖項(xiàng)目可行性研究報(bào)告
- GB 14934-2016食品安全國(guó)家標(biāo)準(zhǔn)消毒餐(飲)具
- 《新聞學(xué)概論》第一章
- CA6140車床撥叉加工工藝及工裝設(shè)計(jì)
- 《血透的抗凝方案》課件
- 企業(yè)負(fù)責(zé)人經(jīng)營(yíng)業(yè)績(jī)考核專項(xiàng)審計(jì)報(bào)告格式范本
- DB11T 712-2019 園林綠化工程資料管理規(guī)程
- 保險(xiǎn)醫(yī)學(xué)課件
評(píng)論
0/150
提交評(píng)論