我們一直在路上,隻爲更優質的(de)服務

SMART SERVICE

這(zhè)裏有一個(gè)簡單實用(yòng)的(de)清洗代碼集

TIME:  2019-01-26

現實世界中的(de)數據通(tōng)常質量不高(gāo),作爲一名數據科學家,有時(shí)也(yě)需要承擔一部分(fēn)數據清洗的(de)工作,這(zhè)要求數據科學家們應該能夠在進行數據分(fēn)析或建模工作之前執行數據清洗步驟,從而确保數據的(de)質量最佳。

數據清洗代碼

不過長(cháng)話(huà)短說,在數據科學領域工作了(le)很長(cháng)一段時(shí)間後,我切實感受到了(le)在進行數據分(fēn)析、可(kě)視化(huà)和(hé)建模工作之前,進行數據清洗工作是多(duō)麽痛苦。

不管你承不承認,數據清洗著(zhe)實不是一件簡單的(de)任務,大(dà)多(duō)數情況下(xià)這(zhè)項工作是十分(fēn)耗時(shí)而乏味的(de),但它又是十分(fēn)重要的(de)。

如果你經曆過數據清洗的(de)過程,你就會明(míng)白我的(de)意思。而這(zhè)正是撰寫這(zhè)篇文章(zhāng)的(de)目的(de)——讓讀者更輕松地進行數據清洗工作。

事實上,我在不久前意識到,在進行數據清洗時(shí),有一些數據具有相似的(de)模式。也(yě)正是從那時(shí)起,我開始整理(lǐ)并編譯了(le)一些數據清洗代碼(見下(xià)文),我認爲這(zhè)些代碼也(yě)适用(yòng)于其它的(de)常見場(chǎng)景。

由于這(zhè)些常見的(de)場(chǎng)景涉及到不同類型的(de)數據集,因此本文更加側重于展示和(hé)解釋這(zhè)些代碼可(kě)以用(yòng)于完成哪些工作,以便讀者更加方便地使用(yòng)它們。

我的(de)數據清洗小工具箱

在下(xià)面的(de)代碼片段中,數據清洗代碼被封裝在了(le)一些函數中,代碼的(de)目的(de)十分(fēn)直觀。你可(kě)以直接使用(yòng)這(zhè)些代碼,無需将它們嵌入到需要進行少量參數修改的(de)函數中。

1. 删除多(duō)列數據


 
  1. def drop_multiple_col(col_names_list, df):  
  2.     ''' 
  3.     AIM    -> Drop multiple columns based on their column names  
  4.  
  5.     INPUT  -> List of column names, df 
  6.  
  7.     OUTPUT -> updated df with dropped columns  
  8.     ------ 
  9.     ''' 
  10.     df.drop(col_names_list, axis=1, inplace=True) 
  11.     return df 

有時(shí),并不是所有列的(de)數據都對(duì)我們的(de)數據分(fēn)析工作有用(yòng)。因此,「df.drop」可(kě)以方便地删掉你選定的(de)列。

2. 轉換 Dtypes


 
  1. def change_dtypes(col_int, col_float, df):  
  2.     ''' 
  3.     AIM    -> Changing dtypes to save memory 
  4.  
  5.     INPUT  -> List of column names (int, float), df 
  6.  
  7.     OUTPUT -> updated df with smaller memory   
  8.     ------ 
  9.     ''' 
  10.     df[col_int] = df[col_int].astype('int32') 
  11.     df[col_float] = df[col_float].astype('float32') 

當我們面對(duì)更大(dà)的(de)數據集時(shí),我們需要對(duì)「dtypes」進行轉換,從而節省内存。如果你有興趣學習(xí)如何使用(yòng)「Pandas」來(lái)處理(lǐ)大(dà)數據,我強烈推薦你閱讀「Why and How to Use Pandas with Large Data」這(zhè)篇文章(zhāng)

(https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c)。

3. 将分(fēn)類變量轉換爲數值變量


 
  1. def convert_cat2num(df): 
  2.     # Convert categorical variable to numerical variable 
  3.     num_encode = {'col_1' : {'YES':1, 'NO':0}, 
  4.                   'col_2'  : {'WON':1, 'LOSE':0, 'DRAW':0}}   
  5.     df.replace(num_encode, inplace=True)   

有一些機器學習(xí)模型要求變量是以數值形式存在的(de)。這(zhè)時(shí),我們就需要将分(fēn)類變量轉換成數值變量然後再将它們作爲模型的(de)輸入。對(duì)于數據可(kě)視化(huà)任務來(lái)說,我建議(yì)大(dà)家保留分(fēn)類變量,從而讓可(kě)視化(huà)結果有更明(míng)确的(de)解釋,便于理(lǐ)解。

4. 檢查缺失的(de)數據


 
  1. def check_missing_data(df): 
  2.     # check for any missing data in the df (display in descending order) 
  3.     return df.isnull().sum().sort_values(ascending=False) 

如果你想要檢查每一列中有多(duō)少缺失的(de)數據,這(zhè)可(kě)能是最快(kuài)的(de)方法。這(zhè)種方法可(kě)以讓你更清楚地知道哪些列有更多(duō)的(de)缺失數據,幫助你決定接下(xià)來(lái)在數據清洗和(hé)數據分(fēn)析工作中應該采取怎樣的(de)行動。

5. 删除列中的(de)字符串


 
  1. def remove_col_str(df): 
  2.     # remove a portion of string in a dataframe column - col_1 
  3.     df['col_1'].replace('\n', '', regex=True, inplace=True) 
  4.  
  5.     # remove all the characters after &# (including &#) for column - col_1 
  6.     df['col_1'].replace(' &#.*', '', regex=True, inplace=True) 

有時(shí)你可(kě)能會看到一行新的(de)字符,或在字符串列中看到一些奇怪的(de)符号。你可(kě)以很容易地使用(yòng) df['col_1'].replace 來(lái)處理(lǐ)該問題,其中「col_1」是數據幀 df 中的(de)一列。

6. 删除列中的(de)空格


 
  1. def remove_col_white_space(df): 
  2.     # remove white space at the beginning of string  
  3.     df[col] = df[col].str.lstrip() 

當數據十分(fēn)混亂時(shí),很多(duō)意想不到的(de)情況都會發生。在字符串的(de)開頭有一些空格是很常見的(de)。因此,當你想要删除列中字符串開頭的(de)空格時(shí),這(zhè)種方法很實用(yòng)。

7. 将兩列字符串數據(在一定條件下(xià))拼接起來(lái)


 
  1. def concat_col_str_condition(df): 
  2.     # concat 2 columns with strings if the last 3 letters of the first column are 'pil' 
  3.     mask = df['col_1'].str.endswith('pil', na=False) 
  4.     col_new = df[mask]['col_1'] + df[mask]['col_2'] 
  5.     col_new.replace('pil', ' ', regex=True, inplace=True)  # replace the 'pil' with emtpy space 

當你希望在一定條件下(xià)将兩列字符串數據組合在一起時(shí),這(zhè)種方法很有用(yòng)。例如,你希望當第一列以某些特定的(de)字母結尾時(shí),将第一列和(hé)第二列數據拼接在一起。根據你的(de)需要,還(hái)可(kě)以在拼接工作完成後将結尾的(de)字母删除掉。

8. 轉換時(shí)間戳(從字符串類型轉換爲日期「DateTime」格式)


 
  1. def convert_str_datetime(df):  
  2.     ''' 
  3.     AIM    -> Convert datetime(String) to datetime(format we want) 
  4.  
  5.     INPUT  -> df 
  6.  
  7.     OUTPUT -> updated df with new datetime format  
  8.     ------ 
  9.     ''' 
  10.     df.insert(loc=2, column='timestamp', value=pd.to_datetime(df.transdate, format='%Y-%m-%d %H:%M:%S.%f')) 

在處理(lǐ)時(shí)間序列數據時(shí),你可(kě)能會遇到字符串格式的(de)時(shí)間戳列。這(zhè)意味著(zhe)我們可(kě)能不得(de)不将字符串格式的(de)數據轉換爲根據我們的(de)需求指定的(de)日期「datetime」格式,以便使用(yòng)這(zhè)些數據進行有意義的(de)分(fēn)析和(hé)展示。