[數據清洗]- Pandas 清洗“臟”數據(二)

来源:https://www.cnblogs.com/BoyceYang/archive/2018/01/04/8186033.html
-Advertisement-
Play Games

概要 瞭解數據 分析數據問題 清洗數據 整合代碼 瞭解數據 在處理任何數據之前,我們的第一任務是理解數據以及數據是乾什麼用的。我們嘗試去理解數據的列/行、記錄、數據格式、語義錯誤、缺失的條目以及錯誤的格式,這樣我們就可以大概瞭解數據分析之前要做哪些“清理”工作。 本次我們需要一個 patient_h ...


概要

  • 瞭解數據
  • 分析數據問題
  • 清洗數據
  • 整合代碼

瞭解數據

在處理任何數據之前,我們的第一任務是理解數據以及數據是乾什麼用的。我們嘗試去理解數據的列/行、記錄、數據格式、語義錯誤、缺失的條目以及錯誤的格式,這樣我們就可以大概瞭解數據分析之前要做哪些“清理”工作。

本次我們需要一個 patient_heart_rate.csv (鏈接:https://pan.baidu.com/s/1geX8oYf 密碼:odj0)的數據文件,這個數據很小,可以讓我們一目瞭然。這個數據是 csv 格式。數據是描述不同個體在不同時間的心跳情況。數據的列信息包括人的年齡、體重、性別和不同時間的心率。

import pandas as pd
df = pd.read_csv('../data/patient_heart_rate.csv')
df.head()

 

 

分析數據問題

  1. 沒有列頭
  2. 一個列有多個參數
  3. 列數據的單位不統一
  4. 缺失值
  5. 空行
  6. 重覆數據
  7. ASCII 字元
  8. 有些列頭應該是數據,而不應該是列名參數


清洗數據

下麵我們就針對上面的問題一一擊破。

1. 沒有列頭

如果我們拿到的數據像上面的數據一樣沒有列頭,Pandas 在讀取 csv 提供了自定義列頭的參數。下麵我們就通過手動設置列頭參數來讀取 csv,代碼如下:

import pandas as pd
# 增加列頭
column_names= ['id', 'name', 'age', 'weight','m0006','m0612','m1218','f0006','f0612','f1218']
df = pd.read_csv('../data/patient_heart_rate.csv', names = column_names)
df.head()

上面的結果展示了我們自定義的列頭。我們只是在這次讀取 csv 的時候,多了傳了一個參數 names = column_names,這個就是告訴 Pandas 使用我們提供的列頭。

 

2. 一個列有多個參數

在數據中不難發現,Name 列包含了兩個參數 Firtname 和 Lastname。為了達到數據整潔目的,我們決定將 name 列拆分成 Firstname 和 Lastname

從技術角度,我們可以使用 split 方法,完成拆分工作。

我們使用 str.split(expand=True),將列表拆成新的列,再將原來的 Name 列刪除

# 切分名字,刪除源數據列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)

上面就是執行執行代碼之後的結果。

 

 3. 列數據的單位不統一

如果仔細觀察數據集可以發現 Weight 列的單位不統一。有的單位是 kgs,有的單位是 lbs

# 獲取 weight 數據列中單位為 lbs 的數據
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
df[rows_with_lbs]

為瞭解決這個問題,將單位統一,我們將單位是 lbs 的數據轉換成 kgs。

# 將 lbs 的數據轉換為 kgs 數據

for i,lbs_row in df[rows_with_lbs].iterrows():
weight = int(float(lbs_row['weight'][:-3])/2.2)
df.at[i,'weight'] = '{}kgs'.format(weight) 

 

4. 缺失值

在數據集中有些年齡、體重、心率是缺失的。我們又遇到了數據清洗最常見的問題——數據缺失。一般是因為沒有收集到這些信息。我們可以咨詢行業專家的意見。典型的處理缺失數據的方法:

 

5. 空行

仔細對比會發現我們的數據中一行空行,除了 index 之外,全部的值都是 NaN。

Pandas 的 read_csv() 並沒有可選參數來忽略空行,這樣,我們就需要在數據被讀入之後再使用 dropna() 進行處理,刪除空行.

# 刪除全空的行
df.dropna(how='all',inplace=True) 

 

6. 重覆數據

有的時候數據集中會有一些重覆的數據。在我們的數據集中也添加了重覆的數據。

首先我們校驗一下是否存在重覆記錄。如果存在重覆記錄,就使用 Pandas 提供的 drop_duplicates() 來刪除重覆數據。

# 刪除重覆數據行
df.drop_duplicates(['first_name','last_name'],inplace=True)

 

7. ASCII 字元

在數據集中 Fristname 和 Lastname 有一些非 ASCII 的字元。

處理非 ASCII 數據方式有多種

  • 刪除
  • 替換
  • 僅僅提示一下

我們使用刪除的方式:

# 刪除非 ASCII 字元
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

8. 有些列頭應該是數據,而不應該是列名參數

有一些列頭是有性別和時間範圍組成的,這些數據有可能是在處理收集的過程中進行了行列轉換,或者收集器的固定命名規則。這些值應該被分解為性別(m,f),小時單位的時間範圍(00-06,06-12,12-18)

# 切分 sex_hour 列為 sex 列和 hour 列
sorted_columns = ['id','age','weight','first_name','last_name']
df = pd.melt(df,
id_vars=sorted_columns,var_name='sex_hour',value_name='puls_rate').sort_values(sorted_columns)
df[['sex','hour']] = df['sex_hour'].apply(lambda x:pd.Series(([x[:1],'{}-{}'.format(x[1:3],x[3:])])))[[0,1]]
df.drop('sex_hour', axis=1, inplace=True)
​
# 刪除沒有心率的數據
row_with_dashes = df['puls_rate'].str.contains('-').fillna(False)
df.drop(df[row_with_dashes].index,
inplace=True)


 整合代碼

import pandas as pd
# 增加列頭
column_names= ['id', 'name', 'age', 'weight','m0006','m0612','m1218','f0006','f0612','f1218']
df = pd.read_csv('../data/patient_heart_rate.csv', names = column_names)
​
# 切分名字,刪除源數據列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)
​
# 獲取 weight 數據列中單位為 lbs 的數據
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
df[rows_with_lbs]
​
# 將 lbs 的數據轉換為 kgs 數據
for i,lbs_row in df[rows_with_lbs].iterrows():
weight = int(float(lbs_row['weight'][:-3])/2.2)
df.at[i,'weight'] = '{}kgs'.format(weight)
 
# 刪除全空的行
df.dropna(how='all',inplace=True)
​
# 刪除重覆數據行
df.drop_duplicates(['first_name','last_name'],inplace=True)
​
# 刪除非 ASCII 字元
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
​
# 切分 sex_hour 列為 sex 列和 hour 列
sorted_columns = ['id','age','weight','first_name','last_name']
df = pd.melt(df,
id_vars=sorted_columns,var_name='sex_hour',value_name='puls_rate').sort_values(sorted_columns)
df[['sex','hour']] = df['sex_hour'].apply(lambda x:pd.Series(([x[:1],'{}-{}'.format(x[1:3],x[3:])])))[[0,1]]
df.drop('sex_hour', axis=1, inplace=True)
​
# 刪除沒有心率的數據
row_with_dashes = df['puls_rate'].str.contains('-').fillna(False)
df.drop(df[row_with_dashes].index,
inplace=True)
​
# 重置索引,不做也沒關係,主要是為了看著美觀一點
df = df.reset_index(drop=True)
print(df)

 

還有一些問題在本例中沒有提及內容,下麵有兩個比較重要,也比較通用的問題:

  • 日期的處理
  • 字元編碼的問題


本次又介紹了一些關於 Pandas 清洗數據的技能。至少用這幾次介紹的處理方法,應該可以對數據做很多清洗工作。

更多關於數據清洗的內容可以關註知乎上的專欄“數據清洗

 知乎數據清洗- Pandas 清洗“臟”數據(二)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 (以下內容為一個朋友所述)今天我想跟大家分享幾個前端經典的面試題,為什麼我突然想寫這麼一篇文章呢?今天我應公司要求去面試了下幾位招聘者,然後又現場整不出幾個難題,就搜了一下前端變態面試題! HAHA,前提我並不是一個變態,欺負人的面試官.只是我希望看看對方的邏輯能力! 從而又拿這些面試題進行了 ...
  • 前面的話 集合、字典和散列表可以存儲不重覆的值。在集合中,我們感興趣的是每個值本身,並把它當作主要元素。在字典中,我們用[鍵,值]的形式來存儲數據。在散列表中也是一樣(也是以[鍵,值]對的形式來存儲數據)。但是兩種數據結構的實現方式略有不同,本文將詳細介紹字典和散列表這兩種數據結構 字典 集合表示一 ...
  • json相信大家都用的多,jsonp我就一直沒有機會用到,但也經常看到,只知道是“用來跨域的”,一直不知道具體是個什麼東西。今天總算搞明白了。下麵一步步來搞清楚jsonp是個什麼玩意。 同源策略 首先基於安全的原因,瀏覽器是存在同源策略這個機制的,同源策略阻止從一個源載入的文檔或腳本獲取或設置另一個 ...
  • 對於一個多人團隊來說,制定一個統一的規範是必要的,因為個性化的東西無法產生良好的聚合效果,規範化可以提高編碼工作效率,使代碼保持統一的風格,以便於代碼整合和後期維護。 2.1 瀏覽器相容 根據公司業務要求而定,一般: 主流程測試:Chrome 30+、IE9+; 完整測試: Chrome 21、IE ...
  • 1、vertical-align基本認識 支持的屬性值: ①線類:baseline(預設),top,middle,bottom ②文本類:text-top,text-bottom ③上標下標類:sub,super ④數值百分比類: 數值和百分比的共性:ⅰ都帶數字;ⅱ都支持負值;ⅲ行為表現一致(都是在 ...
  • 一、表單輸入綁定 1.1、基礎用法 你可以用 v-model 指令在表單控制項元素上創建雙向數據綁定。它會根據控制項類型自動選取正確的方法來更新元素。儘管有些神奇,但 v-model 本質上不過是語法糖,它負責監聽用戶的輸入事件以更新數據,並特別處理一些極端的例子。 v-model 並不關心表單控制項初始 ...
  • 上文說到,有了Spring之後,通過依賴註入的方式,我們的業務代碼不用自己管理關聯對象的生命周期。業務代碼只需要按照業務本身的流程,走啊走啊,走到哪裡,需要另外的對象來協助了,就給Spring說,我想要個對象——於是Spring就很貼心的給你個對象。聽起來似乎很簡單,使用起來也不難,但是如果僅僅是這 ...
  • 寫在開始 小程式升級實時音視頻錄製及播放能力,開放 Wi Fi、NFC(HCE) 等硬體連接功能。同時提供按需載入、自定義組件和更多訪問層級等新特性,增強了第三方平臺的能力,以滿足日趨豐富的業務需求。 為更高效地連接用戶與商家,小程式提供了實時音視頻錄製及播放組件。符合類目要求的小程式自助開通後,可 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...