使用Pandas進行資料清理過程的簡單步驟 - sahilfruitwala

banq發表於2021-07-19

資料清理是刪除、新增或修改資料以進行分析和其他機器學習任務的過程。如果需要資料清理,它總是在任何型別的分析或機器學習任務之前完成。
Clive Humby 說:“資料是新的石油。” 但我們知道資料仍然需要細化。
資料被認為是公司的主要資產之一。誤導性或不準確的資料是有風險的,可能是公司倒閉的原因。可供我們使用的資料不需要每次都有用,我們必須執行許多操作才能使其有用。因此,刪除不必要的資料並格式化和修改重要資料是一個好主意,以便我們可以使用它。在某些場景下,還需要透過對可用資料進行處理來對外新增資訊。例如,根據一些已經存在的資料新增一個語言列,或者根據其他一些列的資料生成一個具有平均值的列。
資料清理過程涉及許多步驟。這些所有步驟都不是每個人都必須遵循或使用的。為了執行資料清理,我們將使用python程式語言和pandas庫。我使用過 python 是因為它的表現力很強,而且很容易學習和理解。更重要的是,python 是許多機器學習任務專家的選擇,因為沒有電腦科學背景的人可以輕鬆學習它。除了python的好處;pandas 是一種快速、強大、靈活且易於使用的開源資料分析和操作工具,是目前最流行的資料分析和處理工具之一。在開始資料清理過程之前瞭解您的資料非常重要,因為執行什麼清理過程完全取決於您擁有什麼樣的資料以及該資料的性質是什麼。
  

清理資料的分步過程
在清理資料之前,正確載入資料很重要。在本教程中,我將展示從 CSV 檔案載入資料的基本方法。在此處查詢更多讀取 CSV 的選項。

import pandas as pd

"""
Data Loading
"""

# 1. Read data from csv default way
# df = pd.read_csv('my_file.csv')

# 2. Read data from csv using comma as delimiter
# df = pd.read_csv('my_file.csv', delimiter=',')

# 3. Read data from csv using comma as delimiter and no headers
# df = pd.read_csv('my_file.csv', delimiter=',', header=None)

# 4. Read data from csv using comma as delimiter and custom headers
my_headers = ['Id','Name', 'Type', 'Price']
df = pd.read_csv('my_file.csv', delimiter=',', header=0, names=my_headers)
 

刪除重複資料
在每個資料清理過程中都需要遵循某些步驟。這些步驟之一是刪除重複資料。無論是文字資料還是數字資料,刪除重複資料都非常重要,因為如果資料集包含太多重複資料,那麼處理該資料的時間也會增加。

"""
Removing Duplicates
"""
# 1. Removes duplicate and returns a copy of dataframe 
df = df.drop_duplicates()

# 2. Removes duplicates in place
df = df.drop_duplicates(inplace=True)

# 3. Drops duplicates and keep first/last occurance
df = df.drop_duplicates(inplace=True, keep='last')

# 4. Consider only certain columns for identigying duplicates
df = df.drop_duplicates(subset=['Id', 'Price'], inplace=True, keep='last')


 

刪除表情符號
在很多情況下,我們不希望在我們的文字資料集中使用表情符號。我們可以透過使用一行程式碼來刪除表情符號。下面顯示的程式碼片段將逐列從 Pandas 資料框中刪除表情符號。程式碼片段可以在Stackoverflow上找到。

"""
Remove emojis
"""
df = df.astype(str).apply(lambda x: x.str.encode('ascii', 'ignore').str.decode('ascii'))

此程式碼片段將所有資料編碼為ASCII(美國資訊交換標準程式碼)值,如果資料無法編碼,則忽略。編碼後,它會嘗試再次將它們全部解碼,因為在編碼過程中忽略了所有表情符號。所以現在我們擁有沒有表情符號的所有資料。
 

將資料改成小寫
很有可能改變資料案例。在這裡,我附加了一個程式碼片段來將資料更改為小寫。

"""
Convert to lowercase
"""
df['Type'] = df['Type'].str.lower()
df['Name'] = df['Name'].str.lower()

 

刪除多個空格、製表符和換行符
每個資料集都包含不必要的空格、製表符和換行符。問題是我們可以清楚地看到製表符和換行符,但看不到空格,這反過來會影響我們訓練模型的時間。

"""
Remove multiple whitespaces, tabs and newlines
"""
df['Type'] = df['Type'].str.replace('\n', '')
df['Type'] = df['Type'].str.replace('\t', ' ')
df['Type'] = df['Type'].str.replace(' {2,}', ' ', regex=True)
df['Type'] = df['Type'].str.strip()


前兩行程式碼將分別用空字元替換製表符和換行符。第三行將在正規表示式(regex)的幫助下找到兩個或多個空格,並將其替換為單個空格。最後,最後一行將從兩邊剝離(去除空格)資料。
 

刪除 URL(統一資源定位器)
許多人使用調查來獲取資料。人們傾向於隨機填寫詳細資訊,有時這些資料中包含 URL。我已經使用程式碼片段中顯示的正規表示式模式來刪除 URL,儘管可以使用任何正規表示式模式來匹配 URL。在這裡,我用空字串字元替換了匹配的 URL 模式。

"""
Remove URLs
"""
df['Type'] = df['Type'].replace(r'http\S+', '', regex=True).replace(r'www\S+', '', regex=True)

 

刪除包含空資料的行
在完成上述所有清理過程後,它在列中留下了一些空資料。我們必須擺脫那些空行,否則會在訓練模型中產生不確定性。為了確保我們刪除所有帶有空資料的行,我們使用如下所示的兩種方法。

"""
Drop Empty Rows
"""
df.dropna()

df['Type'].astype(bool)
df = df[df['Type'].astype(bool)]

第一行刪除包含np.nan、pd.NaT和None 的所有行,而其他行刪除包含空字串字元的行。第二種方法很快,但如果該列甚至有空格,它將不起作用。這是我們更早剝離資料的另一個原因。
 

更多資料處理
有時您需要刪除一些列、從現有資料建立一個新列或刪除其中不包含特定資料的行。

"""
More Data Processing
"""
import numpy as np

df = df.drop(['Id', 'Name'], axis=1)
df = df[df['Type'].str.contains('frozen') | df['Type'].str.contains('green')]

def detect_price(row):
    if row['Price'] > 15.50:
        return 'High'
    elif row['Price'] > 5.50 and row['Price'] <= 15.50:
        return 'Medium'
    elif row['Price'] > 0.0 and row['Price'] <= 5.50:
        return 'Low'
    else:
        return np.NaN

df['Range'] = df.apply (lambda row: detect_price(row), axis=1)



在這裡,第 3 行刪除了名為Id和Name 的兩列;並返回新資料幀的副本。第四行檢查“型別”列是否包含字串frozen 或green ,然後返回 true 並保留該行。第 7 到 17 行基於列“價格”的值建立一個名為“範圍”的新列。透過使用 lambda 函式,我將每一行傳遞給detect_price函式並根據價格返回值。然後將此返回值分配給傳遞給函式的行上的新列。在這裡,使用np.NaN 的一個原因是我們可以在之後使用df.dropna()刪除這些行。

 

結論
資料清理過程是資料科學中涉及的眾多過程之一。擁有乾淨準確的資料是因禍得福。我們需要在每個專案中以不同的方式清理和處理資料。我已經提到了一些經常使用的清潔方法。您也可以建立自己的方法集或使用任何一種現有方法。我在這裡附上了整個程式碼以供參考。



 

相關文章