如何利用 pandas 根據(jù)數(shù)據(jù)類型進(jìn)行篩選?
大家好,我是早起。
前兩天,有一位讀者在知識(shí)星球提出了一個(gè)關(guān)于 pandas 數(shù)據(jù)清洗的問(wèn)題。
他的數(shù)據(jù)大致如下
現(xiàn)在希望分別做如下清洗
“”
A列中非字符行 B列中非日期行 C列中數(shù)值形式行(包括科學(xué)計(jì)數(shù)法的數(shù)值) D列中非整數(shù)行 刪掉C列中大小在10%-90%范圍之外的行
其實(shí)本質(zhì)上都是「數(shù)據(jù)篩選」的問(wèn)題,先來(lái)模擬下數(shù)據(jù)
如上圖所示,基本上都是根據(jù)數(shù)據(jù)類型進(jìn)行數(shù)據(jù)篩選,下面逐個(gè)解決。
取出所有非整數(shù)類型
讓我們從第 4 題開始,取出 D 列全部非整數(shù)行,其實(shí)在 pandas 中可以使用.is_integer() 判斷一個(gè)元素是否為整數(shù)。
這樣我們就能結(jié)合 apply 函數(shù)找到全部整數(shù)行
再使用 ~ 取其補(bǔ)集即可得到答案
df[~df[['D']].apply(lambda?x:?x[0].is_integer(),?axis=1)]
取出所有數(shù)值類型
第 3 題要求取出 C 列所有數(shù)值形式的行。
在 pandas 同樣有直接判斷的函數(shù) .isdigit() 判斷是否為數(shù)值。
所以同上可以結(jié)合 apply 函數(shù)輕松搞定~
df[df['C'].str.isdigit().isnull()].dropna()
取出非日期行
至于第 2 題,pandas 中雖有直接判斷時(shí)間格式函數(shù),但由于存在其他類型數(shù)據(jù),該列為object,并不能直接判斷。
所以只要我們將該列轉(zhuǎn)換為時(shí)間格式(見習(xí)題 8-12)就會(huì)將不支持轉(zhuǎn)換的格式修改為缺失值
這樣在轉(zhuǎn)換后刪除確實(shí)值即可
取出非字符行
至于第 1 題,我們可以借助 Python 中 isinstance 函數(shù)判斷一個(gè)變量是否為字符串格式
再同樣借助 apply 函數(shù)即可找到全部字符串的行,然后使用 ~ 取其補(bǔ)集即可
自定義異常值范圍
最后是一個(gè)看上去是異常值處理的問(wèn)題,但本質(zhì)上還是數(shù)據(jù)篩選。
直接計(jì)算該列的指定范圍,并多條件篩選即可。
至此我們就成功利用 pandas 根據(jù) 數(shù)據(jù)類型 進(jìn)行篩選值。其實(shí)這些題都在「pandas進(jìn)階修煉300題」中有類似的存在。
