八步學會使用Pandas進行數(shù)據(jù)清洗
簡介
如果你對數(shù)據(jù)科學感興趣,那么數(shù)據(jù)清洗可能對你來說是一個熟悉的術語。如果不熟悉,那么本文先來解釋一下。我們的數(shù)據(jù)通常來自多個資源,而且并不干凈。它可能包含缺失值、重復值、錯誤或不需要的格式等。在這種混亂的數(shù)據(jù)上運行實驗會導致錯誤的結果。因此,在將數(shù)據(jù)輸入模型之前,有必要對數(shù)據(jù)進行準備。這種通過識別和解決潛在的錯誤、不準確性和不一致性來準備數(shù)據(jù)的做法被稱為數(shù)據(jù)清洗。
在本教程中將向你介紹使用Pandas進行數(shù)據(jù)清洗的過程。
數(shù)據(jù)集
本文將使用著名的鳶尾花數(shù)據(jù)集進行操作。鳶尾花數(shù)據(jù)集包含三個品種的鳶尾花的四個特征測量值:萼片長度、萼片寬度、花瓣長度和花瓣寬度。本文將使用以下庫:
- Pandas:用于數(shù)據(jù)處理和分析的強大庫
- Scikit-learn:提供數(shù)據(jù)預處理和機器學習的工具
數(shù)據(jù)清洗步驟
1. 加載數(shù)據(jù)集
使用Pandas的read_csv()函數(shù)加載鳶尾花數(shù)據(jù)集:
column_names = ['id', 'sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
iris_data = pd.read_csv('data/Iris.csv', names= column_names, header=0)
iris_data.head()
輸出:
id | sepal_length | sepal_width | petal_length | petal_width | species |
1 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
2 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
3 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
4 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
5 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa |
參數(shù)header=0表示CSV文件的第一行包含列名(標題)。
2. 探索數(shù)據(jù)集
為了深入了解數(shù)據(jù)集的基本信息,本文將使用pandas的內(nèi)置函數(shù)打印一些基本信息:
print(iris_data.info())
print(iris_data.describe())
輸出:
RangeIndex: 150 entries, 0 to 149
Data columns (total 6 columns):
# 列名 非空計數(shù) 類型
--- ------ -------------- -----
0 id 150 non-null int64
1 sepal_length 150 non-null float64
2 sepal_width 150 non-null float64
3 petal_length 150 non-null float64
4 petal_width 150 non-null float64
5 species 150 non-null object
dtypes: float64(4), int64(1), object(1)
memory usage: 7.2+ KB
None
iris_data.describe()的輸出結果
info()函數(shù)有助于了解數(shù)據(jù)幀的整體結構、每列中非空值的數(shù)量以及內(nèi)存使用情況。而匯總統(tǒng)計信息則提供了數(shù)據(jù)集中數(shù)值特征的概覽。
3. 檢查類別分布
這是了解分類列中類別分布情況的重要步驟,對于分類任務來說非常重要??梢允褂肞andas中的value_counts()函數(shù)來執(zhí)行此步驟。
print(iris_data['species'].value_counts())
輸出:
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
Name: species, dtype: int64
輸出的結果顯示,數(shù)據(jù)集是平衡的,每個品種的代表數(shù)量相等。這為所有3個類別進行公平評估和比較奠定了基礎。
4. 刪除缺失值
由于從info()方法明顯可見本文的數(shù)據(jù)中有5列沒有缺失值,因此本文將跳過此步驟。但如果遇到任何缺失值,可以使用以下命令處理它們:
iris_data.dropna(inplace=True)
5. 刪除重復值
重復值可能會扭曲我們的分析結果,因此本文會從數(shù)據(jù)集中刪除它們。首先使用下面的命令檢查是否存在重復值:
duplicate_rows = iris_data.duplicated()
print("Number of duplicate rows:", duplicate_rows.sum())
輸出:
Number of duplicate rows: 0
本文的數(shù)據(jù)集中沒有重復值。不過,如果有重復值,可以使用drop_duplicates()函數(shù)將其刪除:
iris_data.drop_duplicates(inplace=True)
6. 獨熱編碼
對于分類分析,本文將對品種列進行獨熱編碼。由于機器學習算法更適合處理數(shù)值數(shù)據(jù),所以本文進行獨熱編碼這一步驟。獨熱編碼過程將分類變量轉(zhuǎn)換為二進制(0或1)格式。
encoded_species = pd.get_dummies(iris_data['species'], prefix='species', drop_first=False).astype('int')
iris_data = pd.concat([iris_data, encoded_species], axis=1)
iris_data.drop(columns=['species'], inplace=True)
圖片
7. 浮點數(shù)列的歸一化
歸一化是將數(shù)值特征縮放為均值為0、標準差為1的過程。這一過程旨在確保各特征對分析的貢獻相等。本文將對浮點數(shù)列進行歸一化,以便進行一致的縮放。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
cols_to_normalize = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
scaled_data = scaler.fit(iris_data[cols_to_normalize])
iris_data[cols_to_normalize] = scaler.transform(iris_data[cols_to_normalize])
歸一化后的iris_data.describe()輸出結果
8. 保存清洗后的數(shù)據(jù)集
將清洗后的數(shù)據(jù)集保存到新的CSV文件中。
iris_data.to_csv('cleaned_iris.csv', index=False)
總結
恭喜!你已成功使用Pandas清洗了第一個數(shù)據(jù)集。在處理復雜數(shù)據(jù)集時,你可能會遇到其他挑戰(zhàn)。然而,本文介紹的基本技術將幫助你入門,并為開始數(shù)據(jù)分析做好準備。