八步學(xué)會(huì)使用Pandas進(jìn)行數(shù)據(jù)清洗
簡(jiǎn)介
如果你對(duì)數(shù)據(jù)科學(xué)感興趣,那么數(shù)據(jù)清洗可能對(duì)你來(lái)說(shuō)是一個(gè)熟悉的術(shù)語(yǔ)。如果不熟悉,那么本文先來(lái)解釋一下。我們的數(shù)據(jù)通常來(lái)自多個(gè)資源,而且并不干凈。它可能包含缺失值、重復(fù)值、錯(cuò)誤或不需要的格式等。在這種混亂的數(shù)據(jù)上運(yùn)行實(shí)驗(yàn)會(huì)導(dǎo)致錯(cuò)誤的結(jié)果。因此,在將數(shù)據(jù)輸入模型之前,有必要對(duì)數(shù)據(jù)進(jìn)行準(zhǔn)備。這種通過(guò)識(shí)別和解決潛在的錯(cuò)誤、不準(zhǔn)確性和不一致性來(lái)準(zhǔn)備數(shù)據(jù)的做法被稱為數(shù)據(jù)清洗。
在本教程中將向你介紹使用Pandas進(jìn)行數(shù)據(jù)清洗的過(guò)程。
數(shù)據(jù)集
本文將使用著名的鳶尾花數(shù)據(jù)集進(jìn)行操作。鳶尾花數(shù)據(jù)集包含三個(gè)品種的鳶尾花的四個(gè)特征測(cè)量值:萼片長(zhǎng)度、萼片寬度、花瓣長(zhǎng)度和花瓣寬度。本文將使用以下庫(kù):
- Pandas:用于數(shù)據(jù)處理和分析的強(qiáng)大庫(kù)
- Scikit-learn:提供數(shù)據(jù)預(yù)處理和機(jī)器學(xué)習(xí)的工具
數(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文件的第一行包含列名(標(biāo)題)。
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):
# 列名 非空計(jì)數(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()的輸出結(jié)果
info()函數(shù)有助于了解數(shù)據(jù)幀的整體結(jié)構(gòu)、每列中非空值的數(shù)量以及內(nèi)存使用情況。而匯總統(tǒng)計(jì)信息則提供了數(shù)據(jù)集中數(shù)值特征的概覽。
3. 檢查類別分布
這是了解分類列中類別分布情況的重要步驟,對(duì)于分類任務(wù)來(lái)說(shuō)非常重要??梢允褂肞andas中的value_counts()函數(shù)來(lái)執(zhí)行此步驟。
print(iris_data['species'].value_counts())
輸出:
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
Name: species, dtype: int64
輸出的結(jié)果顯示,數(shù)據(jù)集是平衡的,每個(gè)品種的代表數(shù)量相等。這為所有3個(gè)類別進(jìn)行公平評(píng)估和比較奠定了基礎(chǔ)。
4. 刪除缺失值
由于從info()方法明顯可見(jiàn)本文的數(shù)據(jù)中有5列沒(méi)有缺失值,因此本文將跳過(guò)此步驟。但如果遇到任何缺失值,可以使用以下命令處理它們:
iris_data.dropna(inplace=True)
5. 刪除重復(fù)值
重復(fù)值可能會(huì)扭曲我們的分析結(jié)果,因此本文會(huì)從數(shù)據(jù)集中刪除它們。首先使用下面的命令檢查是否存在重復(fù)值:
duplicate_rows = iris_data.duplicated()
print("Number of duplicate rows:", duplicate_rows.sum())
輸出:
Number of duplicate rows: 0
本文的數(shù)據(jù)集中沒(méi)有重復(fù)值。不過(guò),如果有重復(fù)值,可以使用drop_duplicates()函數(shù)將其刪除:
iris_data.drop_duplicates(inplace=True)
6. 獨(dú)熱編碼
對(duì)于分類分析,本文將對(duì)品種列進(jìn)行獨(dú)熱編碼。由于機(jī)器學(xué)習(xí)算法更適合處理數(shù)值數(shù)據(jù),所以本文進(jìn)行獨(dú)熱編碼這一步驟。獨(dú)熱編碼過(guò)程將分類變量轉(zhuǎn)換為二進(jì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. 浮點(diǎn)數(shù)列的歸一化
歸一化是將數(shù)值特征縮放為均值為0、標(biāo)準(zhǔn)差為1的過(guò)程。這一過(guò)程旨在確保各特征對(duì)分析的貢獻(xiàn)相等。本文將對(duì)浮點(diǎn)數(shù)列進(jìn)行歸一化,以便進(jìn)行一致的縮放。
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()輸出結(jié)果
8. 保存清洗后的數(shù)據(jù)集
將清洗后的數(shù)據(jù)集保存到新的CSV文件中。
iris_data.to_csv('cleaned_iris.csv', index=False)
總結(jié)
恭喜!你已成功使用Pandas清洗了第一個(gè)數(shù)據(jù)集。在處理復(fù)雜數(shù)據(jù)集時(shí),你可能會(huì)遇到其他挑戰(zhàn)。然而,本文介紹的基本技術(shù)將幫助你入門,并為開(kāi)始數(shù)據(jù)分析做好準(zhǔn)備。