利用pandas進(jìn)行數(shù)據(jù)清洗的方法
我們有下面的一個(gè)數(shù)據(jù),利用其做簡單的數(shù)據(jù)分析。
這是一家服裝店統(tǒng)計(jì)的會員數(shù)據(jù)。最上面的一行是列坐標(biāo),最左側(cè)一列是行坐標(biāo)。列坐標(biāo)中,第 0 列代表的是序號,第 1 列代表的會員的姓名,第 2 列代表年齡,第 3 列代表體重,第 4~6 列代表男性會員的三圍尺寸,第 7~9 列代表女性會員的三圍尺寸。
數(shù)據(jù)清洗規(guī)則總結(jié)為以下 4 個(gè)關(guān)鍵點(diǎn),統(tǒng)一起來叫“完全合一”,下面來解釋下:
- 完整性:單條數(shù)據(jù)是否存在空值,統(tǒng)計(jì)的字段是否完善。
- 全面性:觀察某一列的全部數(shù)值,比如在 Excel 表中,我們選中一列,可以看到該列的平均值、最大值、最小值。我們可以通過常識來判斷該列是否有問題,比如:數(shù)據(jù)定義、單位標(biāo)識、數(shù)值本身。
- 合法性:數(shù)據(jù)的類型、內(nèi)容、大小的合法性。比如數(shù)據(jù)中存在非 ASCII 字符,性別存在了未知,年齡超過了 150 歲等。
- 唯一性:數(shù)據(jù)是否存在重復(fù)記錄,因?yàn)閿?shù)據(jù)通常來自不同渠道的匯總,重復(fù)的情況是常見的。行數(shù)據(jù)、列數(shù)據(jù)都需要是唯一的,比如一個(gè)人不能重復(fù)記錄多次,且一個(gè)人的體重也不能在列指標(biāo)中重復(fù)記錄多次。
1、完整性
1.1 缺失值
一般情況下,由于數(shù)據(jù)量巨大,在采集數(shù)據(jù)的過程中,會出現(xiàn)有些數(shù)據(jù)單元沒有被采集到,也就是數(shù)據(jù)存在缺失。通常面對這種情況,我們可以采用以下三種方法:
- 刪除:刪除數(shù)據(jù)缺失的記錄
- 均值:使用當(dāng)前列的均值填充
- 高頻:使用當(dāng)前列出現(xiàn)頻率最高的數(shù)據(jù)
比如我們相對data[‘Age']中缺失的數(shù)值使用平均年齡進(jìn)行填充,可以寫:
df['Age'].fillna(df['Age'].mean(), inplace=True)
如果我們用最高頻的數(shù)據(jù)進(jìn)行填充,可以先通過 value_counts 獲取 Age 字段最高頻次 age_maxf,然后再對 Age 字段中缺失的數(shù)據(jù)用 age_maxf 進(jìn)行填充:
age_maxf = train_features['Age'].value_counts().index[0] train_features['Age'].fillna(age_maxf, inplace=True)
1.2 空行
我們發(fā)現(xiàn)數(shù)據(jù)中有一個(gè)空行,除了 index 之外,全部的值都是 NaN。Pandas 的 read_csv() 并沒有可選參數(shù)來忽略空行,這樣,我們就需要在數(shù)據(jù)被讀入之后再使用 dropna() 進(jìn)行處理,刪除空行。
# 刪除全空的行 df.dropna(how='all',inplace=True)
2、全面性
列數(shù)據(jù)的單位不統(tǒng)一
如果某一列數(shù)據(jù)其單位并不統(tǒng)一,比如weight列,有的單位為千克(Kgs),有的單位是磅(Lbs)。
這里我們使用千克作為統(tǒng)一的度量單位,將磅轉(zhuǎn)化為千克:
# 獲取 weight 數(shù)據(jù)列中單位為 lbs 的數(shù)據(jù) rows_with_lbs = df['weight'].str.contains('lbs').fillna(False) print df[rows_with_lbs] # 將 lbs轉(zhuǎn)換為 kgs, 2.2lbs=1kgs for i,lbs_row in df[rows_with_lbs].iterrows(): # 截取從頭開始到倒數(shù)第三個(gè)字符之前,即去掉lbs。 weight = int(float(lbs_row['weight'][:-3])/2.2) df.at[i,'weight'] = '{}kgs'.format(weight)
3、合理性
非ASCII字符
假設(shè)在數(shù)據(jù)集中 Firstname 和 Lastname 有一些非 ASCII 的字符。我們可以采用刪除或者替換的方式來解決非 ASCII 問題,這里我們使用刪除方法,也就是用replace方法:
# 刪除非 ASCII 字符 df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True) df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
4、唯一性
4.1 一列有多個(gè)參數(shù)
假設(shè)姓名(Name)包含了兩個(gè)參數(shù) Firstname和Lastname。為了達(dá)到數(shù)據(jù)整潔的目的,我們將 Name 列拆分成 Firstname 和 Lastname 兩個(gè)字段。我們使用 Python 的 split 方法,str.split(expand=True),將列表拆成新的列,再將原來的 Name 列刪除。
# 切分名字,刪除源數(shù)據(jù)列 df[['first_name','last_name']] = df['name'].str.split(expand=True) df.drop('name', axis=1, inplace=True)
4.2 重復(fù)數(shù)據(jù)
我們校驗(yàn)一下數(shù)據(jù)中是否存在重復(fù)記錄。如果存在重復(fù)記錄,就使用 Pandas 提供的 drop_duplicates() 來刪除重復(fù)數(shù)據(jù)。
# 刪除重復(fù)數(shù)據(jù)行 df.drop_duplicates(['first_name','last_name'],inplace=True)
這樣,我們就將上面案例中中的會員數(shù)據(jù)進(jìn)行了清理,來看看清理之后的數(shù)據(jù)結(jié)果。
到此這篇關(guān)于利用pandas進(jìn)行數(shù)據(jù)清洗的方法的文章就介紹到這了,更多相關(guān)pandas 數(shù)據(jù)清洗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Pandas 數(shù)據(jù)處理,數(shù)據(jù)清洗詳解
- pandas數(shù)據(jù)清洗實(shí)現(xiàn)刪除的項(xiàng)目實(shí)踐
- Pandas數(shù)據(jù)清洗函數(shù)總結(jié)
- Python數(shù)據(jù)清洗之利用pandas篩選數(shù)據(jù)詳解
- Pandas數(shù)據(jù)清洗的實(shí)現(xiàn)
- 利用pandas進(jìn)行數(shù)據(jù)清洗的7種方式
- 基于pandas數(shù)據(jù)清洗的實(shí)現(xiàn)示例
- Pandas數(shù)據(jù)清洗與過濾空值技巧
- Pandas數(shù)據(jù)清洗的維度詳解
- Pandas 數(shù)據(jù)清洗的具體使用
相關(guān)文章
基于python實(shí)現(xiàn)的抓取騰訊視頻所有電影的爬蟲
這篇文章主要介紹了用python實(shí)現(xiàn)的抓取騰訊視頻所有電影的爬蟲,這個(gè)程序使用芒果存, 所以大家需要下載使用mongodb才可以2016-04-04Python機(jī)器學(xué)習(xí)之隨機(jī)梯度下降法的實(shí)現(xiàn)
如果當(dāng)我們數(shù)據(jù)量和樣本量非常大時(shí),每一項(xiàng)都要參與到梯度下降,那么它的計(jì)算量時(shí)非常大的,所以我們需要采用隨機(jī)梯度下降法。本文介紹了Python實(shí)現(xiàn)隨機(jī)梯度下降法的方法,希望對大家有所幫助2023-02-02pip安裝庫報(bào)錯(cuò)[notice]?A?new?release?of?pip?available:?22.2
這篇文章主要給大家介紹了關(guān)于pip安裝庫報(bào)錯(cuò)[notice]?A?new?release?of?pip?available:?22.2?->?22.2.2的相關(guān)資料,文中通過圖文將解決的方法介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03Python+Qt身體特征識別人數(shù)統(tǒng)計(jì)源碼窗體程序(使用步驟)
這篇文章主要介紹了Python+Qt身體特征識別人數(shù)統(tǒng)計(jì)源碼窗體程序(使用步驟),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12Python中Celery異步任務(wù)隊(duì)列的具體使用
Celery是一個(gè)用于處理分布式任務(wù)和作業(yè)隊(duì)列的異步任務(wù)隊(duì)列庫,本文主要介紹了Python中Celery異步任務(wù)隊(duì)列的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02Python實(shí)現(xiàn)字典排序、按照list中字典的某個(gè)key排序的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)字典排序、按照list中字典的某個(gè)key排序的方法,涉及Python字典與列表排序相關(guān)操作技巧,需要的朋友可以參考下2018-12-12Python+DeOldify實(shí)現(xiàn)老照片上色功能
DeOldify是一種技術(shù),以彩色和恢復(fù)舊的黑白圖像,甚至電影片段。它是由一個(gè)叫Jason?Antic的人開發(fā)和更新的。本文將利用DeOldify實(shí)現(xiàn)老照片上色功能,感興趣的可以了解一下2022-06-06