天天看點

Pandas 資料清洗

資料清洗是對一些沒有用的資料進行處理的過程。

很多資料集存在資料缺失、資料格式錯誤、錯誤資料或重複資料的情況,如果要對使資料分析更加準确,就需要對這些沒有用的資料進行處理。

在這個教程中,我們将利用 Pandas包來進行資料清洗。

本文使用到的測試資料 property-data.csv 如下:

Pandas 資料清洗

上表包含來四種空資料:

n/a

NA

na

如果我們要删除包含空字段的行,可以使用 dropna() 方法,文法格式如下:

參數說明:

axis:預設為 0,表示逢空值剔除整行,如果設定參數 axis=1 表示逢空值去掉整列。

how:預設為 'any' 如果一行(或一列)裡任何一個資料有出現 NA 就去掉整行,如果設定 how='all' 一行(或列)都是 NA 才去掉這整行。

thresh:設定需要多少非空值的資料才可以保留下來的。

subset:設定想要檢查的列。如果是多個列,可以使用列名的 list 作為參數。

inplace:如果設定 True,将計算得到的值直接覆寫之前的值并傳回 None,修改的是源資料。

我們可以通過 isnull() 判斷各個單元格是否為空。

import pandas as pd

df = pd.read_csv('property-data.csv')

print (df['NUM_BEDROOMS'])

print (df['NUM_BEDROOMS'].isnull())

以上執行個體輸出結果如下:

Pandas 資料清洗

以上例子中我們看到 Pandas 把 n/a 和 NA 當作空資料,na 不是空資料,不符合我們要求,我們可以指定空資料類型:

missing_values = ["n/a", "na", "--"]

df = pd.read_csv('property-data.csv', na_values = missing_values)

Pandas 資料清洗

接下來的執行個體示範了删除包含空資料的行。

new_df = df.dropna()

print(new_df.to_string())

Pandas 資料清洗

注意:預設情況下,dropna() 方法傳回一個新的 DataFrame,不會修改源資料。

如果你要修改源資料 DataFrame, 可以使用 inplace = True 參數:

df.dropna(inplace = True)

print(df.to_string())

Pandas 資料清洗

我們也可以移除指定列有空值的行:

移除 ST_NUM 列中字段值為空的行:

df.dropna(subset=['ST_NUM'], inplace = True)

Pandas 資料清洗

我們也可以 fillna() 方法來替換一些空字段:

使用 12345 替換空字段:

df.fillna(12345, inplace = True)

Pandas 資料清洗

我們也可以指定某一個列來替換資料:

使用 12345 替換 PID 為空資料:

df['PID'].fillna(12345, inplace = True)

Pandas 資料清洗

替換空單元格的常用方法是計算列的均值、中位數值或衆數。

Pandas使用 mean()、median() 和 mode() 方法計算列的均值(所有值加起來的平均值)、中位數值(排序後排在中間的數)和衆數(出現頻率最高的數)。

使用 mean() 方法計算列的均值并替換空單元格:

x = df["ST_NUM"].mean()

df["ST_NUM"].fillna(x, inplace = True)

以上執行個體輸出結果如下,紅框為計算的均值替換來空單元格:

Pandas 資料清洗

使用 median() 方法計算列的中位數并替換空單元格:

x = df["ST_NUM"].median()

以上執行個體輸出結果如下,紅框為計算的中位數替換來空單元格:

Pandas 資料清洗

使用 mode() 方法計算列的衆數并替換空單元格:

x = df["ST_NUM"].mode()

以上執行個體輸出結果如下,紅框為計算的衆數替換來空單元格:

Pandas 資料清洗

資料格式錯誤的單元格會使資料分析變得困難,甚至不可能。

我們可以通過包含空單元格的行,或者将列中的所有單元格轉換為相同格式的資料。

以下執行個體會格式化日期:

# 第三個日期格式錯誤

data = {

  "Date": ['2020/12/01', '2020/12/02' , '20201226'],

  "duration": [50, 40, 45]

}

df = pd.DataFrame(data, index = ["day1", "day2", "day3"])

df['Date'] = pd.to_datetime(df['Date'])

資料錯誤也是很常見的情況,我們可以對錯誤的資料進行替換或移除。

以下執行個體會替換錯誤年齡的資料:

person = {

  "name": ['Google', 'Runoob' , 'Taobao'],

  "age": [50, 40, 12345]    # 12345 年齡資料是錯誤的

df = pd.DataFrame(person)

df.loc[2, 'age'] = 30 # 修改資料

也可以設定條件語句:

将 age 大于 120 的設定為 120:

  "age": [50, 200, 12345]    

for x in df.index:

  if df.loc[x, "age"] > 120:

    df.loc[x, "age"] = 120

也可以将錯誤資料的行删除:

将 age 大于 120 的删除:

    df.drop(x, inplace = True)

如果我們要清洗重複資料,可以使用 duplicated() 和 drop_duplicates() 方法。

如果對應的資料是重複的,duplicated() 會傳回 True,否則傳回 False。

  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],

  "age": [50, 40, 40, 23]  

print(df.duplicated())

删除重複資料,可以直接使用drop_duplicates() 方法。

persons = {

df = pd.DataFrame(persons)

df.drop_duplicates(inplace = True)

print(df)