Python數(shù)據(jù)分析必備的12種數(shù)據(jù)清洗技術(shù)分享
數(shù)據(jù)清洗是數(shù)據(jù)分析的第一步,它的好壞直接影響到后續(xù)分析的準確性和可靠性。下面我們將詳細介紹 12 種常見的數(shù)據(jù)清洗技術(shù),并通過實際的代碼示例來幫助大家更好地理解和掌握這些技術(shù)。
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)
輸出結(jié)果:
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)
輸出結(jié)果:
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. 刪除重復(fù)值
數(shù)據(jù)集中可能會有重復(fù)的記錄,這些重復(fù)記錄會影響分析結(jié)果。我們可以使用 drop_duplicates() 方法刪除重復(fù)值。
# 創(chuàng)建一個包含重復(fù)值的數(shù)據(jù)集
data = {
'A': [1, 2, 2, 4],
'B': [5, 6, 6, 8],
'C': [9, 10, 10, 12] }
df = pd.DataFrame(data)
# 刪除重復(fù)值
df.drop_duplicates(inplace=True)
print(df)
輸出結(jié)果:
A B C
0 1 5 9
1 2 6 10
3 4 8 12
解釋:
drop_duplicates()方法用于刪除重復(fù)的行。inplace=True參數(shù)表示直接在原數(shù)據(jù)上進行操作,不返回新的 DataFrame。
4. 轉(zhuǎn)換數(shù)據(jù)類型
有時候數(shù)據(jù)的類型可能不符合我們的需求,我們需要轉(zhuǎn)換數(shù)據(jù)類型。例如,將字符串類型的數(shù)字轉(zhuǎn)換為數(shù)值類型。
# 創(chuàng)建一個包含字符串類型數(shù)字的數(shù)據(jù)集
data = {
'A': ['1', '2', '3', '4'],
'B': ['5', '6', '7', '8'] }
df = pd.DataFrame(data)
# 轉(zhuǎn)換數(shù)據(jù)類型
df['A'] = df['A'].astype(int)
df['B'] = df['B'].astype(float)
print(df)
輸出結(jié)果:
A B
0 1 5.0
1 2 6.0
2 3 7.0
3 4 8.
解釋:
astype()方法用于轉(zhuǎn)換數(shù)據(jù)類型。int和float分別表示整數(shù)和浮點數(shù)類型。
5. 處理異常值
異常值是指那些與其他數(shù)據(jù)明顯不同的值,它們可能會對分析結(jié)果產(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)
輸出結(jié)果:
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ù)預(yù)處理中的重要步驟,它們可以將數(shù)據(jù)轉(zhuǎn)換到相同的尺度,便于后續(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)
輸出結(jié)果:
標準化后的數(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ù)轉(zhuǎn)換為均值為 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)
輸出結(jié)果:
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)
輸出結(jié)果:
使用 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ù)分析中非常常見,我們需要學(xué)會如何處理這些數(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)
# 將日期時間列轉(zhuǎn)換為 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)
輸出結(jié)果:
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()方法用于將字符串類型的日期時間轉(zhuǎn)換為 datetime 類型。dt屬性提供了多種日期時間相關(guān)的操作,如提取年份、月份和日期。
10. 文本數(shù)據(jù)處理
文本數(shù)據(jù)在數(shù)據(jù)分析中也很常見,我們需要學(xué)會如何處理這些數(shù)據(jù)。
# 創(chuàng)建一個包含文本數(shù)據(jù)的數(shù)據(jù)集
data = {
'Text': ['hello world', 'python programming', 'data science'] }
df = pd.DataFrame(data)
# 將文本數(shù)據(jù)轉(zhuǎn)換為小寫
df['Text'] = df['Text'].str.lower()
# 替換特定字符
df['Text'] = df['Text'].str.replace(' ', '_')
print(df)
輸出結(jié)果:
Text
0 hello_world
1 python_programming
2 data_science
解釋:
str.lower()方法用于將文本數(shù)據(jù)轉(zhuǎn)換為小寫。str.replace()方法用于替換文本中的特定字符。
11. 處理分類數(shù)據(jù)
分類數(shù)據(jù)在數(shù)據(jù)分析中也很常見,我們需要學(xué)會如何處理這些數(shù)據(jù)。
# 創(chuàng)建一個包含分類數(shù)據(jù)的數(shù)據(jù)集
data = {
'Category': ['A', 'B', 'A', 'C', 'B', 'A'] }
df = pd.DataFrame(data)
# 將分類數(shù)據(jù)轉(zhuǎn)換為類別類型
df['Category'] = df['Category'].astype('category')
# 查看類別及其編碼
print(df['Category'].cat.codes)
輸出結(jié)果:
0 0
1 1
2 0
3 2
4 1
5 0
Name: Category, dtype: int8
解釋:
astype('category')方法用于將數(shù)據(jù)轉(zhuǎn)換為類別類型。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)
輸出結(jié)果:
前向填充后的數(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
總結(jié)
以上介紹了十二種常用的數(shù)據(jù)清洗技術(shù),包括刪除缺失值、填充缺失值、刪除重復(fù)值、轉(zhuǎn)換數(shù)據(jù)類型、處理異常值、標準化與歸一化、重命名列名、合并數(shù)據(jù)集、日期時間處理、文本數(shù)據(jù)處理、處理分類數(shù)據(jù)以及處理缺失值的高級技巧。通過實際代碼示例展示了每種技術(shù)的具體應(yīng)用,有助于讀者更好地理解和掌握這些技術(shù)。
?到此這篇關(guān)于Python數(shù)據(jù)分析必備的12種數(shù)據(jù)清洗技術(shù)分享的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)清洗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對python 矩陣轉(zhuǎn)置transpose的實例講解
下面小編就為大家分享一篇對python 矩陣轉(zhuǎn)置transpose的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python subprocess模塊功能與常見用法實例詳解
這篇文章主要介紹了Python subprocess模塊功能與常見用法,結(jié)合實例形式詳細分析了subprocess模塊功能、常用函數(shù)相關(guān)使用技巧,需要的朋友可以參考下2018-06-06
python3.6.8 + pycharm + PyQt5 環(huán)境搭建的圖文教程
這篇文章主要介紹了python3.6.8 + pycharm + PyQt5 環(huán)境搭建,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06

