Python數(shù)據(jù)分析必備的12種數(shù)據(jù)清洗技術分享
數(shù)據(jù)清洗是數(shù)據(jù)分析的第一步,它的好壞直接影響到后續(xù)分析的準確性和可靠性。下面我們將詳細介紹 12 種常見的數(shù)據(jù)清洗技術,并通過實際的代碼示例來幫助大家更好地理解和掌握這些技術。
1. 刪除缺失值
數(shù)據(jù)集中經(jīng)常會有一些缺失值,這些缺失值可能會干擾我們的分析。我們可以選擇刪除含有缺失值的行或列。
import pandas as pd # 創(chuàng)建一個包含缺失值的數(shù)據(jù)集 data = { 'A': [1, 2, None, 4], 'B': [5, None, 7, 8], 'C': [9, 10, 11, 12] } df = pd.DataFrame(data) # 刪除含有缺失值的行 df.dropna(inplace=True) print(df)
輸出結果:
A B C
3 4 8 12
解釋:
dropna()
方法用于刪除含有缺失值的行或列。inplace=True
參數(shù)表示直接在原數(shù)據(jù)上進行操作,不返回新的 DataFrame。
2. 填充缺失值
有時候刪除缺失值并不是最佳選擇,我們可以選擇填充缺失值。常見的填充方法包括使用均值、中位數(shù)、眾數(shù)等。
# 填充缺失值 df = pd.DataFrame(data) # 使用均值填充 df.fillna(df.mean(), inplace=True) print(df)
輸出結果:
A B C
0 1.0 5.0 9
1 2.0 7.5 10
2 3.0 7.0 11
3 4.0 8.0 12
解釋:
fillna()
方法用于填充缺失值。df.mean()
計算每一列的均值,并用這些均值填充缺失值。
3. 刪除重復值
數(shù)據(jù)集中可能會有重復的記錄,這些重復記錄會影響分析結果。我們可以使用 drop_duplicates()
方法刪除重復值。
# 創(chuàng)建一個包含重復值的數(shù)據(jù)集 data = { 'A': [1, 2, 2, 4], 'B': [5, 6, 6, 8], 'C': [9, 10, 10, 12] } df = pd.DataFrame(data) # 刪除重復值 df.drop_duplicates(inplace=True) print(df)
輸出結果:
A B C
0 1 5 9
1 2 6 10
3 4 8 12
解釋:
drop_duplicates()
方法用于刪除重復的行。inplace=True
參數(shù)表示直接在原數(shù)據(jù)上進行操作,不返回新的 DataFrame。
4. 轉換數(shù)據(jù)類型
有時候數(shù)據(jù)的類型可能不符合我們的需求,我們需要轉換數(shù)據(jù)類型。例如,將字符串類型的數(shù)字轉換為數(shù)值類型。
# 創(chuàng)建一個包含字符串類型數(shù)字的數(shù)據(jù)集 data = { 'A': ['1', '2', '3', '4'], 'B': ['5', '6', '7', '8'] } df = pd.DataFrame(data) # 轉換數(shù)據(jù)類型 df['A'] = df['A'].astype(int) df['B'] = df['B'].astype(float) print(df)
輸出結果:
A B
0 1 5.0
1 2 6.0
2 3 7.0
3 4 8.
解釋:
astype()
方法用于轉換數(shù)據(jù)類型。int
和float
分別表示整數(shù)和浮點數(shù)類型。
5. 處理異常值
異常值是指那些與其他數(shù)據(jù)明顯不同的值,它們可能會對分析結果產(chǎn)生負面影響。我們可以使用統(tǒng)計方法來檢測和處理異常值。
# 創(chuàng)建一個包含異常值的數(shù)據(jù)集 data = { 'A': [1, 2, 3, 100], 'B': [5, 6, 7, 8] } df = pd.DataFrame(data) # 檢測異常值 Q1 = df.quantile(0.25) Q3 = df.quantile(0.75) IQR = Q3 - Q1 # 定義異常值的范圍 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR # 刪除異常值 df = df[~((df < lower_bound) | (df > upper_bound)).any(axis=1)] print(df)
輸出結果:
A B
0 1 5
1 2 6
2 3 7
解釋:
quantile()
方法用于計算四分位數(shù)。IQR
表示四分位距,即第三四分位數(shù)減去第一四分位數(shù)。lower_bound
和upper_bound
分別表示異常值的下界和上界。~
符號表示取反,any(axis=1)
表示任何一列有異常值的行都會被刪除。
6. 標準化和歸一化
標準化和歸一化是數(shù)據(jù)預處理中的重要步驟,它們可以將數(shù)據(jù)轉換到相同的尺度,便于后續(xù)的分析和建模。
from sklearn.preprocessing import StandardScaler, MinMaxScaler # 創(chuàng)建一個數(shù)據(jù)集 data = { 'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8] } df = pd.DataFrame(data) # 標準化 scaler = StandardScaler() df_scaled = scaler.fit_transform(df) df_scaled = pd.DataFrame(df_scaled, columns=df.columns) print("標準化后的數(shù)據(jù):") print(df_scaled) # 歸一化 scaler = MinMaxScaler() df_normalized = scaler.fit_transform(df) df_normalized = pd.DataFrame(df_normalized, columns=df.columns) print("\n歸一化后的數(shù)據(jù):") print(df_normalized)
輸出結果:
標準化后的數(shù)據(jù):
A B
0 -1.341641 -1.341641
1 -0.447214 -0.447214
2 0.447214 0.447214
3 1.341641 1.341641
歸一化后的數(shù)據(jù):
A B
0 0.000000 0.000000
1 0.333333 0.333333
2 0.666667 0.666667
3 1.000000 1.000000
解釋:
StandardScaler
用于標準化,將數(shù)據(jù)轉換為均值為 0,標準差為 1 的分布。MinMaxScaler
用于歸一化,將數(shù)據(jù)縮放到 [0, 1] 區(qū)間。
7. 重命名列名
有時候我們需要對數(shù)據(jù)集的列名進行重命名,以便更好地理解和使用數(shù)據(jù)。
# 創(chuàng)建一個數(shù)據(jù)集 data = { 'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8] } df = pd.DataFrame(data) # 重命名列名 df.rename(columns={'A': 'Column1', 'B': 'Column2'}, inplace=True) print(df)
輸出結果:
Column1 Column2
0 1 5
1 2 6
2 3 7
3 4
解釋:
rename()
方法用于重命名列名columns
參數(shù)是一個字典,鍵是舊列名,值是新列名。inplace=True
參數(shù)表示直接在原數(shù)據(jù)上進行操作,不返回新的 DataFrame。
8. 合并數(shù)據(jù)集
在數(shù)據(jù)分析中,我們經(jīng)常需要將多個數(shù)據(jù)集合并在一起。Pandas 提供了多種合并方法,如 concat
和 merge
# 創(chuàng)建兩個數(shù)據(jù)集 data1 = { 'A': [1, 2, 3], 'B': [4, 5, 6] } df1 = pd.DataFrame(data1) data2 = { 'A': [4, 5, 6], 'B': [7, 8, 9] } df2 = pd.DataFrame(data2) # 使用 concat 合并數(shù)據(jù)集 df_concat = pd.concat([df1, df2], ignore_index=True) print("使用 concat 合并的數(shù)據(jù)集:") print(df_concat) # 使用 merge 合并數(shù)據(jù)集 df_merge = pd.merge(df1, df2, on='A', how='outer') print("\n使用 merge 合并的數(shù)據(jù)集:") print(df_merge)
輸出結果:
使用 concat 合并的數(shù)據(jù)集:
A B
0 1 4
1 2 5
2 3 6
3 4 7
4 5 8
5 6 9
使用 merge 合并的數(shù)據(jù)集:
A B_x B_y
0 1.0 4.0 NaN
1 2.0 5.0 NaN
2 3.0 6.0 NaN
3 4.0 NaN 7.0
4 5.0 NaN 8.0
5 6.0 NaN 9.0
解釋:
pd.concat()
方法用于縱向或橫向拼接多個數(shù)據(jù)集。ignore_index=True
參數(shù)表示重新生成索引。pd.merge()
方法用于根據(jù)指定的列進行合并。on='A'
參數(shù)表示根據(jù)列 ‘A’ 進行合并。how='outer'
參數(shù)表示外連接,保留所有數(shù)據(jù)。
9. 日期時間處理
日期時間數(shù)據(jù)在數(shù)據(jù)分析中非常常見,我們需要學會如何處理這些數(shù)據(jù)。
# 創(chuàng)建一個包含日期時間的數(shù)據(jù)集 data = { 'Date': ['2023-01-01', '2023-01-02', '2023-01-03'], 'Value': [10, 20, 30] } df = pd.DataFrame(data) # 將日期時間列轉換為 datetime 類型 df['Date'] = pd.to_datetime(df['Date']) # 提取年份、月份和日期 df['Year'] = df['Date'].dt.year df['Month'] = df['Date'].dt.month df['Day'] = df['Date'].dt.day print(df)
輸出結果:
Date Value Year Month Day
0 2023-01-01 10 2023 1 1
1 2023-01-02 20 2023 1 2
2 2023-01-03 30 2023 1 3
解釋:
pd.to_datetime()
方法用于將字符串類型的日期時間轉換為 datetime 類型。dt
屬性提供了多種日期時間相關的操作,如提取年份、月份和日期。
10. 文本數(shù)據(jù)處理
文本數(shù)據(jù)在數(shù)據(jù)分析中也很常見,我們需要學會如何處理這些數(shù)據(jù)。
# 創(chuàng)建一個包含文本數(shù)據(jù)的數(shù)據(jù)集 data = { 'Text': ['hello world', 'python programming', 'data science'] } df = pd.DataFrame(data) # 將文本數(shù)據(jù)轉換為小寫 df['Text'] = df['Text'].str.lower() # 替換特定字符 df['Text'] = df['Text'].str.replace(' ', '_') print(df)
輸出結果:
Text
0 hello_world
1 python_programming
2 data_science
解釋:
str.lower()
方法用于將文本數(shù)據(jù)轉換為小寫。str.replace()
方法用于替換文本中的特定字符。
11. 處理分類數(shù)據(jù)
分類數(shù)據(jù)在數(shù)據(jù)分析中也很常見,我們需要學會如何處理這些數(shù)據(jù)。
# 創(chuàng)建一個包含分類數(shù)據(jù)的數(shù)據(jù)集 data = { 'Category': ['A', 'B', 'A', 'C', 'B', 'A'] } df = pd.DataFrame(data) # 將分類數(shù)據(jù)轉換為類別類型 df['Category'] = df['Category'].astype('category') # 查看類別及其編碼 print(df['Category'].cat.codes)
輸出結果:
0 0
1 1
2 0
3 2
4 1
5 0
Name: Category, dtype: int8
解釋:
astype('category')
方法用于將數(shù)據(jù)轉換為類別類型。cat.codes
屬性用于查看類別的編碼。
12. 處理缺失值的高級技巧
除了簡單的刪除和填充缺失值,還有一些高級技巧可以幫助我們更好地處理缺失值。
# 創(chuàng)建一個包含缺失值的數(shù)據(jù)集 data = { 'A': [1, 2, None, 4], 'B': [5, None, 7, 8], 'C': [9, 10, 11, 12] } df = pd.DataFrame(data) # 使用前向填充 df.fillna(method='ffill', inplace=True) print("前向填充后的數(shù)據(jù):") print(df) # 使用后向填充 df = pd.DataFrame(data) df.fillna(method='bfill', inplace=True) print("\n后向填充后的數(shù)據(jù):") print(df)
輸出結果:
前向填充后的數(shù)據(jù):
A B C
0 1.0 5.0 9
1 2.0 5.0 10
2 2.0 7.0 11
3 4.0 8.0 12
后向填充后的數(shù)據(jù):
A B C
0 1.0 5.0 9
1 2.0 7.0 10
2 4.0 7.0 11
3 4.0 8.0 12
總結
以上介紹了十二種常用的數(shù)據(jù)清洗技術,包括刪除缺失值、填充缺失值、刪除重復值、轉換數(shù)據(jù)類型、處理異常值、標準化與歸一化、重命名列名、合并數(shù)據(jù)集、日期時間處理、文本數(shù)據(jù)處理、處理分類數(shù)據(jù)以及處理缺失值的高級技巧。通過實際代碼示例展示了每種技術的具體應用,有助于讀者更好地理解和掌握這些技術。
?到此這篇關于Python數(shù)據(jù)分析必備的12種數(shù)據(jù)清洗技術分享的文章就介紹到這了,更多相關Python數(shù)據(jù)清洗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python subprocess模塊功能與常見用法實例詳解
這篇文章主要介紹了Python subprocess模塊功能與常見用法,結合實例形式詳細分析了subprocess模塊功能、常用函數(shù)相關使用技巧,需要的朋友可以參考下2018-06-06python3.6.8 + pycharm + PyQt5 環(huán)境搭建的圖文教程
這篇文章主要介紹了python3.6.8 + pycharm + PyQt5 環(huán)境搭建,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06