python之?dāng)?shù)據(jù)清理-以二手房信息為例

第二部分:數(shù)據(jù)的清洗
數(shù)據(jù)的預(yù)處理主要是對(duì)原始數(shù)據(jù)進(jìn)行一些清洗和整理工作,由于數(shù)據(jù)的質(zhì)量影響著分析結(jié)果的質(zhì)量,因此提高數(shù)據(jù)的質(zhì)量對(duì)于后續(xù)的研究十分必要。
本文的數(shù)據(jù)清洗工作主要是用了python的numpy和pandas兩個(gè)工具包,具體內(nèi)容如下:

(1)excel數(shù)據(jù)的讀寫(xiě)操作通過(guò)爬蟲(chóng)的數(shù)據(jù)保存在本地的excel文件里,現(xiàn)在要做的就是pandas讀取這些文件,以便進(jìn)行后續(xù)操作,具體代碼如下行:
df = pd.read_csv('desktop/house_old_shanghai.csv',encoding='gbk',index_col=0,header=0)
本行代碼讀取了存貯路徑為‘desktop/house_old_shanghai.csv’的excel文件,并且指定編碼格式為gbk,注意如果不指定編碼格式,讀取的內(nèi)容可能會(huì)出現(xiàn)亂碼。

(2)選取某一列的部分字段
原始數(shù)據(jù)中評(píng)分列的數(shù)據(jù)類(lèi)型是object,比如某些數(shù)據(jù)帶有單位如評(píng)分:4.0分,要?jiǎng)h去評(píng)分的單位‘分’才能將該列轉(zhuǎn)還為數(shù)值型,具體python操作如下:
df['評(píng)分']=df['評(píng)分'].apply(lambda x:x[:-1])
此處用到了apply和lambda函數(shù),功能是對(duì)列標(biāo)簽為’評(píng)分‘的列區(qū)取從0到倒數(shù)第一位字符,也就是刪去了原有的倒數(shù)第一個(gè)字符“分”。

(3)選取部分行
在原始數(shù)據(jù)中,’評(píng)分‘這一列可能包含著其它雜亂數(shù)據(jù),需要把這些數(shù)據(jù)刪去,具體代碼如下:
df['評(píng)分'].str.contains('0|1|2|3|4|5')
此處用到了contains函數(shù),該函數(shù)的功能是對(duì)于包含括號(hào)里的值的行返回為T(mén)rue,因?yàn)槲覀冃枰氖窃u(píng)分的數(shù)據(jù)(去掉單位),所以包含數(shù)字0~5的就是我們需要的行。如果想知道有哪些數(shù)據(jù)不是我們想要的,~取反即可,如下所示
df1[~df1['評(píng)分'].str.contains('0|1|2|3|4|5')]


image

(4)選某列需要的數(shù)據(jù)
除了上述contains方法外,還可以使用extract搭配正則表達(dá)式選取滿(mǎn)足需要的數(shù)據(jù),python代碼如下所示:
df['評(píng)分']=df['評(píng)分'].str.extract('(\d+\.\d+)')
使用該方法既可以在列上進(jìn)行選取,也可以同時(shí)在行上進(jìn)行選取。簡(jiǎn)單說(shuō)一下此處正則表達(dá)式的用法,因?yàn)樵嫉臄?shù)據(jù)格式是“4.0分”,\d+表示匹配數(shù)字,\.表示.符號(hào)(\為轉(zhuǎn)義),\d+表示匹配數(shù)字,這樣就可過(guò)濾掉其他字符了。

(5)刪除含有空值的行
在上一個(gè)步驟篩選后的列中可能有空值,需要?jiǎng)h除這些含有空值的行可以采用如下代碼:
df.dropna(axis=0,how='any')
其中,參數(shù)axis=0表示按照行刪除,axis=1表示按照列刪除,how=‘a(chǎn)ny’表示含有空值就刪除,how=‘a(chǎn)ll’表示所有的元素都是空值才刪除

(6)刪除重復(fù)的行
爬蟲(chóng)獲取的數(shù)據(jù)可能有重復(fù)的數(shù)據(jù),因此需要?jiǎng)h除重復(fù)的行,具體python代碼如下:
df.drop_duplicates(keep='first')
參數(shù)keep可以設(shè)置是否保留重復(fù)的行,keep=False表示不保留

(7)轉(zhuǎn)化數(shù)據(jù)類(lèi)型
首先可以用df.info()查看每列的數(shù)據(jù)類(lèi)型,可以看到在未對(duì)數(shù)據(jù)類(lèi)型更改之前,G列數(shù)據(jù)的數(shù)據(jù)類(lèi)型是object,改變后某一列的數(shù)據(jù)類(lèi)型是float32,如下所示:
df['G'].astype('float32')


image

image

(8)添加列標(biāo)簽
按照上述步驟,將每一列的數(shù)據(jù)都清洗完畢并添加列標(biāo)簽,最終得到的數(shù)據(jù)如下圖所示:
a=['介紹','地址','價(jià)格','面積','房間','地產(chǎn)公司','評(píng)分']
df.columns =a


image

image

(9)列的拆分
如下圖中,第一列的數(shù)據(jù)包含了好幾個(gè)屬性值,因此需要拆分,代碼如下所示:
df['A'].str.split('|',expand=True)


屏幕快照 2020-03-05 下午5.25.35.png

(10)按照某個(gè)字段的內(nèi)容添加另一列
如上圖中的第二列是房屋詳細(xì)的地址,現(xiàn)在需要添加一列,內(nèi)容是小區(qū)的地區(qū),可以從第二列中提取相關(guān)信息,具體代碼如下所示:
a=['浦東','閔行','寶山','徐匯','松江','嘉定','靜安','普陀','楊浦','虹口','長(zhǎng)寧','黃浦','青浦','奉賢','金山','崇明']
for循環(huán)遍歷列表 loc函數(shù)指定對(duì)應(yīng)的列
for i in a:
df.loc[(df['B'].str.contains(i)),['E']]=i

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容