
Python/Pandas中的None VS NaN
大家在進行資料清理時一定會遇到一個問題,到底缺失值、空值要怎麼判斷,以及如何處理? 而且時常會被他們的定義搞得頭昏腦脹…
再加上每種程式語言中對於null、None、nan、””等的定義可能不盡相同,因此這篇文章將以Python和相關套件所定義的為主。

1. 什麼是 None ?
- 是 Python 中的內建空值型態(類似於 Java 的 null)
- 通常用來表示尚未賦值的變數、函式沒有回傳值
x = None
print(x is None)
# 輸出
True
2. 什麼是 NaN ?
- 全名是 Not a Number
- 來自 numpy(np.nan),通常出現在數值型欄位中
- Pandas 認為 NaN 是缺失值(missing value)
import numpy as np
x = np.nan
print(np.isnan(x))
# 輸出
True
3. Pandas處理None/Nan
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': [1, None, 3],
'B': [4, np.nan, 6]
})
# 輸出
| A | B |
| --- | --- |
| 1.0 | 4.0 |
| NaN | NaN |
| 3.0 | 6.0 |
說明
🔍 注意:Pandas 自動將 None 轉為 NaN 在數值欄位中。
4. 如何檢查空值/缺失值?

df = pd.DataFrame({
'Name': ['Amy', None, 'Cara'],
'Score': [90, np.nan, 88]
})
print(df)
df.isna() # 檢查是否有缺失值
df.dropna() # 移除有缺失值的列
df.fillna('Unknown') # 補上字串
# 輸出
Name Score
0 Amy 90.0
1 None NaN
2 Cara 88.0
Name Score
0 False False
1 True True
2 False False
Name Score
0 Amy 90.0
2 Cara 88.0
Name Score
0 Amy 90.0
1 Unknown Unknown
2 Cara 88.0
說明
- df.dropna(axis=0, how='any', inplace=False)
- axis: 0為按照row刪;1為按照column刪
- how: 'any'代表有一個na就刪;'all'代表全都na才刪
- inplace: 是否直接替換原df中的值
- df.fillna('要補上的值')
數值計算上之差異
此差異主要會是在前處理過程中,缺失值尚未處理乾淨時可能會遇到。
None + 1
np.nan + 1
# 輸出
TypeError
nan
小結

最佳實務建議
- ✅ 在 Pandas 資料集中統一使用 np.nan 或 pd.NA
- ✅ 使用 pd.isna() / pd.notna() 進行判斷(支援兩者)
- ✅ 避免混用 None 與 np.nan,尤其是數值欄位