處理缺失數據是數據分析和機器學習中最常見的挑戰之一。缺失值可能因為多種原因而產生,例如數據收集時的錯誤、手動遺漏,甚至是自然缺乏的信息。無論原因如何,這些空白都會對你的分析或預測模型的質量和準確性產生重大影響。
Pandas 是一個非常受歡迎的 Python 數據處理庫,提供了強大的工具來有效處理缺失值。其中,fillna() 方法是一個多功能且高效的處理缺失數據的方式。這個方法可以用特定的值、平均數、中位數、眾數,甚至是前向填充和後向填充技術來替換缺失值,確保你的數據集完整且準備好進行分析。
什麼是數據填補?
數據填補是填補數據集中缺失或不完整數據的過程。當數據缺失時,會在分析中造成問題,因為許多算法和統計技術需要完整的數據集才能正常運作。數據填補通過根據數據集中現有的數據來估算和替換缺失值,解決了這個問題。
為什麼數據填補很重要?
原因如下:
扭曲的數據集
缺失數據可能會扭曲變數的分佈,改變數據集的完整性。這種扭曲可能導致異常情況,改變類別的相對重要性,並產生誤導性的結果。
例如,某一特定人口群體中缺失值的數量過多,可能會導致調查分析中的權重不正確。
機器學習庫的限制
大多數機器學習庫,例如 Scikit-learn,假設數據集是完整的。缺失值可能會導致錯誤或阻止算法的成功執行,因為這些工具通常缺乏處理此類問題的內建機制。
開發者必須在將數據輸入這些模型之前,先對數據進行預處理以解決缺失值的問題。
對模型性能的影響
缺失數據會引入偏差,導致不準確的預測和不可靠的見解。基於不完整或處理不當的數據訓練的模型可能無法有效地概括。
例如,如果某一特定群體的收入數據缺失,模型可能無法捕捉到與該群體相關的關鍵趨勢。
希望恢復數據集的完整性
在數據至關重要或數據集較小的情況下,即使失去一小部分也可能對分析產生重大影響。填補變得至關重要,以保留所有可用的信息,同時減輕缺失數據的影響。
例如,一個小型醫學研究數據集如果刪除缺失值的行,可能會失去統計意義。
也可以參考:Pandas 數據分析和處理的函數
理解 Pandas 中的 fillna()
fillna() 方法用於用指定的值或計算值替換 DataFrame 或 Series 中的缺失值(NaN)。缺失值可能由於多種原因而產生,例如數據輸入不完整或數據提取錯誤。解決這些缺失值確保了你的分析或模型的完整性和可靠性。
Pandas 中 fillna() 的語法
fillna() 中有一些重要的參數:
- value:用於填補缺失值的標量、字典、Series 或 DataFrame。
- method:填補方法。可以是:
- ‘ffill’(前向填充):用沿著軸的最後有效值替換 NaN。
- ‘bfill’(後向填充):用下一個有效值替換 NaN。
- axis:應用方法的軸(0 代表行,1 代表列)。
- inplace:如果為 True,則修改原始對象。
- limit:要填補的最大連續 NaNs 數量。
- downcast:嘗試將結果數據轉換為較小的數據類型。
使用 fillna() 進行不同的數據填補技術
有幾種數據填補技術,旨在保留數據集的結構和統計特性,同時最小化偏差。這些方法從簡單的統計方法到基於機器學習的高級策略,各自適用於特定類型的數據和缺失模式。
我們將看到一些可以用 fillna() 實現的技術:
1. 下一個或上一個值
對於時間序列或有序數據,填補方法通常利用數據集的自然順序,假設相近的值比遠離的值更相似。一種常見的方法是用序列中的下一個或上一個值替換缺失值。這種技術對於名義數據和數值數據都很有效。
import pandas as pd
data = {'Time': [1, 2, 3, 4, 5], 'Value': [10, None, None, 25, 30]}
df = pd.DataFrame(data)
# 前向填充
df_ffill = df.fillna(method='ffill')
# 後向填充
df_bfill = df.fillna(method='bfill')
print(df_ffill)
print(df_bfill)
也可以參考:有效處理數據分析中缺失值的策略
2. 最大值或最小值
當數據已知在特定範圍內時,可以使用該範圍的最大值或最小值來填補缺失值。這種方法在數據收集工具在某個限制下飽和時特別有用。例如,如果在金融市場中達到價格上限,可以用最大允許值替換缺失的價格。
import pandas as pd
data = {'Time': [1, 2, 3, 4, 5], 'Value': [10, None, None, 25, 30]}
df = pd.DataFrame(data)
# 用列的最小值填補缺失值
df_min = df.fillna(df.min())
# 用列的最大值填補缺失值
df_max = df.fillna(df.max())
print(df_min)
print(df_max)
3. 平均值填補
平均值填補是用該列中可用數據的平均值來替換缺失值。這是一種簡單的方法,當數據相對對稱且沒有異常值時效果良好。平均值代表數據的集中趨勢,因此在數據集具有正態分佈時,這是一個合理的填補選擇。然而,使用平均值的主要缺點是它對異常值敏感。極端值可能會扭曲平均值,導致填補的結果無法反映數據的真實分佈。因此,對於具有顯著異常值或偏斜分佈的數據集,這並不是理想的選擇。
import pandas as pd
import numpy as np
# 示例數據集,包含缺失值
data = {'A': [1, 2, np.nan, 4, 5, np.nan, 7],
'B': [10, np.nan, 30, 40, np.nan, 60, 70]}
df = pd.DataFrame(data)
# 平均值填補
df['A_mean'] = df['A'].fillna(df['A'].mean())
print("填補後的數據集:")
print(df)
4. 中位數填補
中位數填補用中位數值替換缺失值,中位數是數據有序時的中間值。當數據包含異常值或偏斜時,這種方法特別有用。與平均值不同,中位數不受極端值的影響,因此在這種情況下是一個更穩健的選擇。當數據具有高變異性或包含可能扭曲平均值的異常值時,中位數提供了更好的集中趨勢測量。然而,一個缺點是它可能無法捕捉到數據的全部變異性,特別是在遵循正態分佈的數據集中。因此,在這種情況下,平均值通常會提供更準確的數據真實中心值的表示。
import pandas as pd
import numpy as np
# 示例數據集,包含缺失值
data = {'A': [1, 2, np.nan, 4, 5, np.nan, 7],
'B': [10, np.nan, 30, 40, np.nan, 60, 70]}
df = pd.DataFrame(data)
# 中位數填補
df['A_median'] = df['A'].fillna(df['A'].median())
print("填補後的數據集:")
print(df)
5. 移動平均填補
移動平均填補方法計算指定數量的周圍值的平均值,稱為“窗口”,並使用這個平均值來填補缺失數據。這種方法對於時間序列數據或觀察值與前後數據相關的數據集特別有價值。移動平均有助於平滑波動,為缺失值提供更具上下文的估計。它通常用於處理時間序列數據中的空白,假設相近的值可能更相似。主要的缺點是,如果數據存在較大空白或不規則模式,可能會引入偏差,並且對於大型數據集或複雜的移動平均計算可能會計算量大。然而,它在捕捉數據中的時間關係方面非常有效。
import pandas as pd
import numpy as np
# 示例數據集,包含缺失值
data = {'A': [1, 2, np.nan, 4, 5, np.nan, 7],
'B': [10, np.nan, 30, 40, np.nan, 60, 70]}
df = pd.DataFrame(data)
# 移動平均填補(使用窗口大小為2)
df['A_moving_avg'] = df['A'].fillna(df['A'].rolling(window=2, min_periods=1).mean())
print("填補後的數據集:")
print(df)
6. 四捨五入平均填補
四捨五入平均填補技術涉及用四捨五入的平均值替換缺失值。當數據具有特定的精度或刻度要求時,例如處理離散值或應該四捨五入到特定小數位的數據時,這種方法經常被應用。例如,如果數據集中包含兩位小數的值,將平均值四捨五入到兩位小數可以確保填補的值與數據的其餘部分一致。這種方法使數據更具可解釋性,並使填補與數據集的精度水平相符。然而,一個缺點是四捨五入可能會導致精度的損失,特別是在對於分析至關重要的細微值的數據集中。
import pandas as pd
import numpy as np
# 示例數據集,包含缺失值
data = {'A': [1, 2, np.nan, 4, 5, np.nan, 7],
'B': [10, np.nan, 30, 40, np.nan, 60, 70]}
df = pd.DataFrame(data)
# 四捨五入平均填補
df['A_rounded_mean'] = df['A'].fillna(round(df['A'].mean()))
print("填補後的數據集:")
print(df)
7. 固定值填補
固定值填補是一種簡單且多功能的處理缺失數據的技術,通過用預定的值替換缺失值來進行填補,這些值是根據數據集的上下文選擇的。對於類別數據,這可能涉及用“未回答”或“未知”等佔位符替換缺失的回答,而數值數據則可能使用 0 或其他在邏輯上有意義的固定值。這種方法確保了一致性,並且易於實施,適合快速預處理。然而,如果固定值不反映數據的分佈,可能會引入偏差,從而降低變異性並影響模型性能。為了減輕這些問題,選擇具有上下文意義的值非常重要,並清楚記錄填補的值,分析缺失的程度以評估填補的影響。
import pandas as pd
# 示例數據集,包含缺失值
data = {
'Age': [25, None, 30, None],
'Survey_Response': ['Yes', None, 'No', None]
}
df = pd.DataFrame(data)
# 固定值填補
# 對於數值數據(例如年齡),用固定數字(如 0)替換缺失值
df['Age'] = df['Age'].fillna(0)
# 對於類別數據(例如調查回答),用“未回答”替換缺失值
df['Survey_Response'] = df['Survey_Response'].fillna('未回答')
print("\n填補後的數據框:")
print(df)
也可以參考:準確的數據填補方法
結論
有效處理缺失數據對於維護數據集的完整性和確保分析及機器學習模型的準確性至關重要。Pandas 的 fillna() 方法提供了一種靈活且高效的數據填補方法,適應不同數據類型和上下文的各種技術。
從簡單的方法,如用固定值或統計測量(平均值、中位數、眾數)替換缺失值,到更複雜的技術,如前向/後向填充和移動平均,每種策略都有其優勢,適合特定情境。通過選擇合適的填補技術,實踐者可以減輕缺失數據的影響,最小化偏差,並保留數據集的統計特性。
最終,選擇正確的填補方法需要理解數據集的性質、缺失模式和分析的目標。使用像 fillna() 這樣的工具,數據科學家和分析師能夠高效地處理缺失數據,從而在工作流程中實現穩健和可靠的結果。
如果你正在尋找在線的 AI/ML 課程,可以探索:認證的 AI & ML BlackBelt Plus 課程
常見問題
Ans. Pandas 中的 fillna() 方法用於用指定的值、方法或計算替換 DataFrame 或 Series 中的缺失值(NaN)。它允許用固定值填補,使用像 ffill(前向填充)或 bfill(後向填充)等方法傳播前一個或下一個有效值,或者使用字典按列應用不同的策略。這個函數對於處理缺失數據和確保數據集完整性以進行分析至關重要。
Ans. Pandas 中 dropna() 和 fillna() 的主要區別在於它們如何處理缺失值(NaN)。dropna() 刪除包含缺失值的行或列,有效地減少 DataFrame 或 Series 的大小。相反,fillna() 用指定的數據(如固定值、計算值或傳播附近的值)替換缺失值,而不改變 DataFrame 的維度。當你想排除不完整數據時使用 dropna(),而當你想通過填補空白來保留數據集的結構時使用 fillna()。
Ans. 在 Pandas 中,fillna() 和 interpolate() 都處理缺失值,但方法不同。fillna() 用指定的值(例如常數、平均值、中位數)替換 NaN,或傳播現有值(例如 ffill、bfill)。相反,interpolate() 使用周圍數據估算缺失值,使其適合於具有邏輯趨勢的數值數據。簡而言之,fillna() 進行明確的替換,而 interpolate() 根據數據模式推斷值。
新聞來源
本文由 AI 台灣 使用 AI 編撰,內容僅供參考,請自行進行事實查核。加入 AI TAIWAN Google News,隨時掌握最新 AI 資訊!