跳到主要內容

[Pandas教學]解密Pandas套件清理類別資料(Categorical Data)的方法

pandas_categorical_data

如果有在實作資料分析或機器學習的朋友就會知道,為了要群組或分類相似的資料,會使用標籤、代號或數字等類別資料(Categorical Data)進行分群。像是影像辨識,將相近的圖片使用特定的標籤來代表,提升分析或訓練模型的效率。

但是當資料量非常龐大時,就可能因為人為輸入或解析有誤,導致類別資料(Categorical Data)產生不一致的問題。所以,本文以Kaggle網站的銀行直銷資料集(bank-direct-marketing-campaigns.csv)為例,來聊聊如何利用Pandas套件來進行清理。重點包含:

  • 什麼是類別資料(Categorical Data)
  • Pandas類別資料(Categorical Data)的變數清理
  • Pandas類別資料(Categorical Data)的成員清理

一、什麼是類別資料(Categorical Data)

也就是預先定義的數個「標籤」或「數字」等,來代表資料集裡特定群組的資料。

舉例來說,銀行直銷資料集(bank-direct-marketing-campaigns.csv)的「job(職業)」欄位,在Kaggle文件上已預先定義幾個類別資料(Categorical Data),如下圖:

pandas_categorical_data

所以,「job(職業)」欄位的資料就只會包含預先定義的類別資料(Categorical Data),可以透過Pandas套件的value_counts()來檢視各類別資料(Categorical Data)的筆數,如下範例

import pandas as pd


df = pd.read_csv('bank-direct-marketing-campaigns.csv')

print(df['job'].value_counts())

執行結果

pandas_categorical_data

二、Pandas類別資料(Categorical Data)的變數清理

雖然預先定義了類別資料(Categorical Data),但是在蒐集與整合各種資料的過程中,類別資料(Categorical Data)的變數就可能含有以下2種髒資料(Dirty Data):

  • 英文大小寫不一致
  • 含有空白

如果沒有加以處理,就可能誤導分析的結果。筆者為了示範,將銀行直銷資料集(bank-direct-marketing-campaigns.csv)「job(職業)」欄位加以調整如下圖:

pandas_categorical_data

看起來同為services(服務業),但是大小寫不一致,就會導致資料統計上的錯誤,如下範例

import pandas as pd


df = pd.read_csv('bank-direct-marketing-campaigns.csv')

print(df['job'].value_counts())

執行結果

pandas_categorical_data

這時候,想要利用Pandas套件來清理類別資料(Categorical Data)的變數,可以都轉為大寫,如下範例

import pandas as pd


df = pd.read_csv('bank-direct-marketing-campaigns.csv')

df['job'] = df['job'].str.upper()  #轉為大寫

print(df)

截取部分執行結果

pandas_categorical_data

或是轉為小寫,如下範例

import pandas as pd


df = pd.read_csv('bank-direct-marketing-campaigns.csv')

df['job'] = df['job'].str.lower()  #轉為小寫

print(df)

截取部分執行結果

pandas_categorical_data

讓資料集裡的類別資料(Categorical Data)變數和預先定義的保持一致。

而含有空白的類別資料(Categorical Data)變數,同樣會影響分析的結果,使用Pandas套件進行資料清理的方式,如下範例

import pandas as pd


df = pd.read_csv('bank-direct-marketing-campaigns.csv')

df['job'] = df['job'].str.strip()  #去除前後空白

三、Pandas類別資料(Categorical Data)的成員清理

另一個類別資料(Categorical Data)常發生的問題,就是欄位中包含了非類別資料(Categorical Data)的成員。筆者調整銀行直銷資料集(bank-direct-marketing-campaigns.csv)後,示範如下圖:

pandas_categorical_data

我們都知道,「job(職業)」欄位預先定義的類別資料(Categorical Data)成員並不包含teacher(老師),這時候,該如何利用Pandas套件來進行刪除呢?

這邊就會建議大家預先定義類別資料(Categorical Data)時,能夠另外建立檔案來存放,以本文為例,新增job-category.csv檔案,存放「job(職業)」欄位的類別資料(Categorical Data)成員,如下範例

import pandas as pd


df = pd.read_csv('bank-direct-marketing-campaigns.csv')

job_category = pd.read_csv('job-category.csv')

print(job_category)

執行結果

pandas_categorical_data

接下來,就可以在原資料集,使用Set集合,取「job(職業)」欄位的唯一值,再透過difference()方法(Method),取出與類別資料(Categorical Data)成員不一樣的值,如下範例

import pandas as pd


df = pd.read_csv('bank-direct-marketing-campaigns.csv')

job_category = pd.read_csv('job-category.csv')

difference_category = set(df['job']).difference(job_category['job_category'])

print(difference_category)  #執行結果 {'teacher'}

而要檢視這筆非類別資料(Categorical Data)成員的各欄位資料,則可以利用Pandas套件的isin()方法(Method)來達成,如下範例

import pandas as pd


df = pd.read_csv('bank-direct-marketing-campaigns.csv')

job_category = pd.read_csv('job-category.csv')

difference_category = set(df['job']).difference(job_category['job_category'])

difference_row = df['job'].isin(difference_category)

print(df[difference_row])

截取部分執行結果

pandas_categorical_data

最後,使用Pandas套件的「~」語法,取得反向數據,也就是剩餘符合類別資料(Categorical Data)成員的資料,如下範例

import pandas as pd


df = pd.read_csv('bank-direct-marketing-campaigns.csv')

job_category = pd.read_csv('job-category.csv')

difference_category = set(df['job']).difference(job_category['job_category'])

difference_row = df['job'].isin(difference_category)

result = df[~difference_row]

print(result)

截取部分執行結果

pandas_categorical_data

四、小結

本文整理了Pandas套件在清理類別資料(Categorical Data)的過程中,需要注意的「變數」及「成員」問題,讓欄位裡的類別資料(Categorical Data)能夠和預先定義的保有一致性,避免含有不一致的髒資料(Dirty Data)影響分析的結果。希望本文有幫助到大家學會使用Pandas套件清理類別資料(Categorical Data)。

本文是筆者Mike在DataCamp平台上所學到的Pandas套件資料清理技巧,加以應用和大家分享。DataCamp平台上非常多與資料科學、分析有關的教學,包含資料視覺化、清理、機器學習等,並且有專家帶領你完成資料分析專案,大家有興趣的話,可以加入DataCamp平台一起學習唷

如果喜歡我的文章,別忘了在下面訂閱本網站,以及幫我按五下Like(使用GoogleFacebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。

有想要看的教學內容嗎?歡迎利用以下的Google表單讓我知道,將有機會成為教學文章,分享給大家😊

Python學習資源

Python網頁爬蟲推薦課程
Pandas資料分析教學









留言