我們一直在路上,隻爲更優質的(de)服務
SMART SERVICE
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ō)列數據
def drop_multiple_col(col_names_list, df):
'''
AIM -> Drop multiple columns based on their column names
INPUT -> List of column names, df
OUTPUT -> updated df with dropped columns
------
'''
df.drop(col_names_list, axis=1, inplace=True)
return df
有時(shí),并不是所有列的(de)數據都對(duì)我們的(de)數據分(fēn)析工作有用(yòng)。因此,「df.drop」可(kě)以方便地删掉你選定的(de)列。
2. 轉換 Dtypes
def change_dtypes(col_int, col_float, df):
'''
AIM -> Changing dtypes to save memory
INPUT -> List of column names (int, float), df
OUTPUT -> updated df with smaller memory
------
'''
df[col_int] = df[col_int].astype('int32')
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)類變量轉換爲數值變量
def convert_cat2num(df):
# Convert categorical variable to numerical variable
num_encode = {'col_1' : {'YES':1, 'NO':0},
'col_2' : {'WON':1, 'LOSE':0, 'DRAW':0}}
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)數據
def check_missing_data(df):
# check for any missing data in the df (display in descending order)
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)字符串
def remove_col_str(df):
# remove a portion of string in a dataframe column - col_1
df['col_1'].replace('n', '', regex=True, inplace=True)
# remove all the characters after &# (including &#) for column - col_1
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)空格
def remove_col_white_space(df):
# remove white space at the beginning of string
df[col] = df[col].str.lstrip()
當數據十分(fēn)混亂時(shí),很多(duō)意想不到的(de)情況都會發生。在字符串的(de)開頭有一些空格是很常見的(de)。因此,當你想要删除列中字符串開頭的(de)空格時(shí),這(zhè)種方法很實用(yòng)。
7. 将兩列字符串數據(在一定條件下(xià))拼接起來(lái)
def concat_col_str_condition(df):
# concat 2 columns with strings if the last 3 letters of the first column are 'pil'
mask = df['col_1'].str.endswith('pil', na=False)
col_new = df[mask]['col_1'] + df[mask]['col_2']
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」格式)
def convert_str_datetime(df):
'''
AIM -> Convert datetime(String) to datetime(format we want)
INPUT -> df
OUTPUT -> updated df with new datetime format
------
'''
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é)展示。