iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
0
AI & Data

大數據的世代需學會的幾件事系列 第 5

Day5-輕鬆駕馭數據part3

在上一篇文章(Day4-輕鬆駕馭數據part2)中,介紹陣列型態的資料,透過DataFrame的方法,將資料做整理、篩選、刪除...操作。今天要來持續介紹Pandas的功能,缺失值的處理(Handling Missing Data)

Handling Missing Data

在數據蒐集時,並不是每一資料屬性都能蒐集到(通常在會呈現:null、NaN、NA值),因此,我們在做資料處理時,我們要先把資料做標準化整理。

import nupmy as np
import pandas as pd

建立一個陣列,其中包含缺失值,並運算陣列值的總和。

  • None
value = np.array([1, None, 3, 4])
value.sum()

error
None在資料陣列,是一非數值型態的資料,因此不能做加總運算。

  • nan
value2 = np.array([1, np.nan, 3, 4]) 
value2.dtype

dtype('float64')

value2.sum(), value2.min(), value2.max()

(nan, nan, nan)
nan為資料型態float,但是數值未明確定義,所以在做統計資料(例如:找出最大值、最小值或加總),會輸出皆為nana的錯誤結果

若是要排除nan值,做統計處理。

np.nansum(value2), np.nanmin(value2), np.nanmax(value2)

因為nan為float資料型態,所以運算出的結果亦為資料型態float。


下表為各種缺失值在Pandas上的轉換:

Typeclass Conversion When Storing NAs NA Sentinel Value
floating No change np.nan
object No change None or np.nan
integer Cast to float64 np.nan
boolean Cast to object None or np.nan

  1. Detecting null values
    判斷每一資料值是否為null
data = pd.Series([1, np.nan, 'abc', None])
data.isnull()

0 False
1 True
2 False
3 True
dtype: bool


判斷每一資料值不為null

data = pd.Series([1, np.nan, 'abc', None])
data.notnull()

0 True
1 False
2 True
3 False
dtype: bool

  1. Dropping null values
    有時候在做資料處理時,會將屬於null的值捨棄掉。
df = pd.DataFrame([[1,      np.nan, 2],
                   [2,      3,      5],
                   [np.nan, 4,      6]])
df

out

  • 將存在null值的「列」刪除
df.dropna()

out

  • 將存在null值的「行」刪除
df.dropna(axis='columns')

out

  • all,當該行的值全為null時*(how='all'),則該行(axis='columns')*捨棄。
df.dropna(axis='columns', how='all')

out

  • any,當該行的值其一值為null時*(how='any'),則該行(axis='columns')*捨棄。
df.dropna(axis='columns', how='any')

out

  1. Filling null values 填補缺失值
    做資料處理時,可以將null的值用0或者其他指定方式來處理。
  • 將null值以0代替
data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
data
data.fillna(0)
  • 將null值以後一項的資料值代替
data.fillna(method='bfill')

out

  • 將null值以前一項的資料值代替
df = pd.DataFrame([[1,      np.nan, 2],
                   [2,      3,      5],
                   [np.nan, 4,      6]])
df.fillna(method='ffill', axis=1)

out


上一篇
Day4-輕鬆駕馭數據part2
下一篇
Day6-輕鬆駕馭數據part4
系列文
大數據的世代需學會的幾件事30

尚未有邦友留言

立即登入留言