Pandas 數(shù)據(jù)清洗的具體使用
數(shù)據(jù)清洗是對一些沒有用的數(shù)據(jù)進行處理的過程。很多數(shù)據(jù)集存在數(shù)據(jù)缺失、數(shù)據(jù)格式錯誤、錯誤數(shù)據(jù)或重復數(shù)據(jù)的情況,如果要使數(shù)據(jù)分析更加準確,就需要對這些沒有用的數(shù)據(jù)進行處理。數(shù)據(jù)清洗與預處理的常見步驟:
- 缺失值處理:識別并填補缺失值,或刪除含缺失值的行/列。
- 重復數(shù)據(jù)處理:檢查并刪除重復數(shù)據(jù),確保每條數(shù)據(jù)唯一。
- 異常值處理:識別并處理異常值,如極端值、錯誤值。
- 數(shù)據(jù)格式轉(zhuǎn)換:轉(zhuǎn)換數(shù)據(jù)類型或進行單位轉(zhuǎn)換,如日期格式轉(zhuǎn)換。
- 標準化與歸一化:對數(shù)值型數(shù)據(jù)進行標準化(如 Z-score)或歸一化(如 Min-Max)。
- 類別數(shù)據(jù)編碼:將類別變量轉(zhuǎn)換為數(shù)值形式,常見方法包括 One-Hot 編碼和標簽編碼。
- 文本處理:對文本數(shù)據(jù)進行清洗,如去除停用詞、詞干化、分詞等。
- 數(shù)據(jù)抽樣:從數(shù)據(jù)集中抽取樣本,或通過過采樣/欠采樣處理類別不平衡。
- 特征工程:創(chuàng)建新特征、刪除不相關(guān)特征、選擇重要特征等。
本文使用到的測試數(shù)據(jù) property-data.csv 如下:

上表包含了四種空數(shù)據(jù):
- n/a
- NA
- —
- na
1 Pandas 清洗空值
如果我們要刪除包含空字段的行,可以使用 dropna() 方法,語法格式如下:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
- axis:默認為 0,表示逢空值剔除整行,如果設(shè)置參數(shù) axis=1 表示逢空值去掉整列。
- how:默認為 'any' 如果一行(或一列)里任何一個數(shù)據(jù)有出現(xiàn) NA 就去掉整行,如果設(shè)置 how='all' 一行(或列)都是 NA 才去掉這整行。
- thresh:設(shè)置需要多少非空值的數(shù)據(jù)才可以保留下來的。
- subset:設(shè)置想要檢查的列。如果是多個列,可以使用列名的 list 作為參數(shù)。
- inplace:如果設(shè)置 True,將計算得到的值直接覆蓋之前的值并返回 None,修改的是源數(shù)據(jù)。
1.1 isnull() 判斷各個單元格是否為空
我們可以通過 isnull() 判斷各個單元格是否為空。
import pandas as pd
df = pd.read_csv('property-data.csv')
print(df['NUM_BEDROOMS'])
print(df['NUM_BEDROOMS'].isnull())

以上例子中我們看到 Pandas 沒有把 n/a 和 NA 當作空數(shù)據(jù),不符合我們要求,我們可以指定空數(shù)據(jù)類型:
import pandas as pd
missing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values=missing_values)
print(df['NUM_BEDROOMS'])
print(df['NUM_BEDROOMS'].isnull())

1.2 dropna() 刪除包含空數(shù)據(jù)的行
接下來的實例演示了刪除包含空數(shù)據(jù)的行。
import pandas as pd
df = pd.read_csv('property-data.csv')
new_df = df.dropna()
print(new_df.to_string())
默認情況下,dropna() 方法返回一個新的 DataFrame,不會修改源數(shù)據(jù)。如果你要修改源數(shù)據(jù) DataFrame, 可以使用 inplace = True 參數(shù):
df.dropna(inplace = True)
我們也可以移除指定列有空值的行:
import pandas as pd
df = pd.read_csv('property-data.csv')
df.dropna(subset=['ST_NUM'], inplace=True)
print(df.to_string())

1.3 fillna() 替換空字段
我們也可以 fillna() 方法來替換一些空字段:
import pandas as pd
df = pd.read_csv('property-data.csv')
df.fillna(12345, inplace=True)
print(df.to_string())

我們也可以指定某一個列來替換數(shù)據(jù),例如使用 12345 替換 PID 為空數(shù)據(jù):
df.fillna({ 'PID' : 12345 }, inplace = True)
替換空單元格的常用方法是計算列的均值、中位數(shù)值或眾數(shù)。Pandas使用 mean()、median() 和 mode() 方法計算列的均值(所有值加起來的平均值)、中位數(shù)值(排序后排在中間的數(shù))和眾數(shù)(出現(xiàn)頻率最高的數(shù))。
1.3.1 mean() 均值替換
import pandas as pd
df = pd.read_csv('property-data.csv')
x = df["ST_NUM"].mean()
df.fillna({ 'ST_NUM': x }, inplace=True)
print(df.to_string())
以上實例輸出結(jié)果如下,紅框為計算的中位數(shù)替換來空單元格:

1.3.2 median() 中位數(shù)替換
import pandas as pd
df = pd.read_csv('property-data.csv')
x = df["ST_NUM"].median()
df.fillna({'ST_NUM': x}, inplace=True)
print(df.to_string())

1.3.3 mode() 眾數(shù)替換
import pandas as pd
df = pd.read_csv('property-data.csv')
x = df["ST_NUM"].mode()
df.fillna({'ST_NUM': x.values[0]}, inplace=True)
print(df.to_string())
mode()可能會出現(xiàn)多個值,所以需要用values[index]指定。

2 Pandas 清洗格式錯誤數(shù)據(jù)
數(shù)據(jù)格式錯誤的單元格會使數(shù)據(jù)分析變得困難,甚至不可能。我們可以通過包含空單元格的行,或者將列中的所有單元格轉(zhuǎn)換為相同格式的數(shù)據(jù)。以下實例會格式化日期:
import pandas as pd
# 第三個日期格式錯誤
data = {
"Date": ['2020/12/01', '2020/12/02', '20201226'],
"duration": [50, 40, 45]
}
df = pd.DataFrame(data, index=["day1", "day2", "day3"])
df['Date'] = pd.to_datetime(df['Date'], format='mixed')
print(df.to_string())

3 Pandas 清洗錯誤數(shù)據(jù)
數(shù)據(jù)錯誤也是很常見的情況,我們可以對錯誤的數(shù)據(jù)進行替換或移除。以下實例會替換錯誤年齡的數(shù)據(jù):
import pandas as pd
person = {
"name": ['Google', 'Bing', 'Taobao'],
"age": [50, 40, 12345] # 12345 年齡數(shù)據(jù)是錯誤的
}
df = pd.DataFrame(person)
df.loc[2, 'age'] = 30 # 修改數(shù)據(jù)
print(df.to_string())

也可以設(shè)置條件語句,例如將 age 大于 120 的設(shè)置為 120:
import pandas as pd
person = {
"name": ['Google', 'Bing', 'Taobao'],
"age": [50, 200, 12345]
}
df = pd.DataFrame(person)
for x in df.index:
if df.loc[x, "age"] > 120:
df.loc[x, "age"] = 120
print(df.to_string())

也可以將錯誤數(shù)據(jù)的行刪除,例如將 age 大于 120 的刪除:
import pandas as pd
person = {
"name": ['Google', 'Runoob', 'Taobao'],
"age": [50, 40, 12345] # 12345 年齡數(shù)據(jù)是錯誤的
}
df = pd.DataFrame(person)
for x in df.index:
if df.loc[x, "age"] > 120:
df.drop(x, inplace=True)
print(df.to_string())

4 Pandas 清洗重復數(shù)據(jù)
如果我們要清洗重復數(shù)據(jù),可以使用 duplicated() 和 drop_duplicates() 方法。如果對應(yīng)的數(shù)據(jù)是重復的,duplicated() 會返回 True,否則返回 False。
import pandas as pd
person = {
"name": ['Google', 'Bing', 'Bing', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)
print(df.duplicated())
刪除重復數(shù)據(jù),可以直接使用drop_duplicates() 方法。
import pandas as pd
person = {
"name": ['Google', 'Bing', 'Bing', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)
df.drop_duplicates(inplace=True)
print(df)

5 常用方法及說明
| 操作 | 方法/步驟 | 說明 | 常用函數(shù)/方法 |
|---|---|---|---|
| 缺失值處理 | 填充缺失值 | 使用指定的值(如均值、中位數(shù)、眾數(shù)等)填充缺失值。 | df.fillna(value) |
| 刪除缺失值 | 刪除包含缺失值的行或列。 | df.dropna() | |
| 重復數(shù)據(jù)處理 | 刪除重復數(shù)據(jù) | 刪除 DataFrame 中的重復行。 | df.drop_duplicates() |
| 異常值處理 | 異常值檢測(基于統(tǒng)計方法) | 通過 Z-score 或 IQR 方法識別并處理異常值。 | 自定義函數(shù)(如基于 Z-score 或 IQR) |
| 替換異常值 | 使用合適的值(如均值或中位數(shù))替換異常值。 | 自定義函數(shù)(如替換異常值) | |
| 數(shù)據(jù)格式轉(zhuǎn)換 | 轉(zhuǎn)換數(shù)據(jù)類型 | 將數(shù)據(jù)類型從一個類型轉(zhuǎn)換為另一個類型,如將字符串轉(zhuǎn)換為日期。 | df.astype() |
| 日期時間格式轉(zhuǎn)換 | 轉(zhuǎn)換字符串或數(shù)字為日期時間類型。 | pd.to_datetime() | |
| 標準化與歸一化 | 標準化 | 將數(shù)據(jù)轉(zhuǎn)換為均值為0,標準差為1的分布。 | StandardScaler() |
| 歸一化 | 將數(shù)據(jù)縮放到指定的范圍(如 [0, 1])。 | MinMaxScaler() | |
| 類別數(shù)據(jù)編碼 | 標簽編碼 | 將類別變量轉(zhuǎn)換為整數(shù)形式。 | LabelEncoder() |
| 獨熱編碼(One-Hot Encoding) | 將每個類別轉(zhuǎn)換為一個新的二進制特征。 | pd.get_dummies() | |
| 文本數(shù)據(jù)處理 | 去除停用詞 | 從文本中去除無關(guān)緊要的詞,如 "the" 、 "is" 等。 | 自定義函數(shù)(基于 nltk 或 spaCy) |
| 詞干化與詞形還原 | 提取詞干或恢復單詞的基本形式。 | nltk.stem.PorterStemmer() | |
| 分詞 | 將文本分割成單詞或子詞。 | nltk.word_tokenize() | |
| 數(shù)據(jù)抽樣 | 隨機抽樣 | 從數(shù)據(jù)中隨機抽取一定比例的樣本。 | df.sample() |
| 上采樣與下采樣 | 通過過采樣(復制少數(shù)類樣本)或欠采樣(減少多數(shù)類樣本)來平衡數(shù)據(jù)集中的類別分布。 | SMOTE()(上采樣); RandomUnderSampler()(下采樣) | |
| 特征工程 | 特征選擇 | 選擇對目標變量有影響的特征,去除冗余或無關(guān)特征。 | SelectKBest() |
| 特征提取 | 從原始數(shù)據(jù)中創(chuàng)建新的特征,提升模型的預測能力。 | PolynomialFeatures() | |
| 特征縮放 | 對數(shù)值特征進行縮放,使其具有相同的量級。 | MinMaxScaler() 、 StandardScaler() | |
| 類別特征映射 | 特征映射 | 將類別變量映射為對應(yīng)的數(shù)字編碼。 | 自定義映射函數(shù) |
| 數(shù)據(jù)合并與連接 | 合并數(shù)據(jù) | 將多個 DataFrame 按照某些列合并在一起,支持內(nèi)連接、外連接、左連接、右連接等。 | pd.merge() |
| 連接數(shù)據(jù) | 將多個 DataFrame 進行行或列拼接。 | pd.concat() | |
| 數(shù)據(jù)重塑 | 數(shù)據(jù)透視表 | 將數(shù)據(jù)根據(jù)某些維度進行分組并計算聚合結(jié)果。 | pd.pivot_table() |
| 數(shù)據(jù)變形 | 改變數(shù)據(jù)的形狀,如從長格式轉(zhuǎn)為寬格式或從寬格式轉(zhuǎn)為長格式。 | df.melt() 、 df.pivot() | |
| 數(shù)據(jù)類型轉(zhuǎn)換與處理 | 字符串處理 | 對字符串數(shù)據(jù)進行處理,如去除空格、轉(zhuǎn)換大小寫等。 | str.replace() 、 str.upper() 等 |
| 分組計算 | 按照某個特征分組后進行聚合計算。 | df.groupby() | |
| 缺失值預測填充 | 使用模型預測填充缺失值 | 使用機器學習模型(如回歸模型)預測缺失值,并填充缺失數(shù)據(jù)。 | 自定義模型(如 sklearn.linear_model.LinearRegression) |
| 時間序列處理 | 時間序列缺失值填充 | 使用時間序列的方法(如前向填充、后向填充)填充缺失值。 | df.fillna(method='ffill') |
| 滾動窗口計算 | 使用滑動窗口進行時間序列數(shù)據(jù)的統(tǒng)計計算(如均值、標準差等)。 | df.rolling(window=5).mean() | |
| 數(shù)據(jù)轉(zhuǎn)換與映射 | 數(shù)據(jù)映射與替換 | 將數(shù)據(jù)中的某些值替換為其他值。 | df.replace() |
到此這篇關(guān)于Pandas 數(shù)據(jù)清洗的具體使用的文章就介紹到這了,更多相關(guān)Pandas 數(shù)據(jù)清洗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用keras使用神經(jīng)網(wǎng)絡(luò)預測銷量操作
這篇文章主要介紹了利用keras使用神經(jīng)網(wǎng)絡(luò)預測銷量操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Python selenium抓取微博內(nèi)容的示例代碼
本篇文章主要介紹了Python selenium抓取微博內(nèi)容的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
pycharm遠程連接服務(wù)器并配置python interpreter的方法
這篇文章主要介紹了pycharm遠程連接服務(wù)器并配置python interpreter的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
python實現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息
這篇文章主要介紹了python實現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息的方法,是非常實用的技巧,涉及到文件的讀寫與字典的操作等技巧,需要的朋友可以參考下2014-09-09
python實現(xiàn)爬蟲統(tǒng)計學校BBS男女比例之多線程爬蟲(二)
這篇文章主要介紹了python實現(xiàn)爬蟲統(tǒng)計學校BBS男女比例之多線程爬蟲,感興趣的小伙伴們可以參考一下2015-12-12
jupyter notebook oepncv 顯示一張圖像的實現(xiàn)
這篇文章主要介紹了jupyter notebook oepncv 顯示一張圖像的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
python數(shù)據(jù)結(jié)構(gòu)之鏈表的實例講解
下面小編就為大家?guī)硪黄猵ython數(shù)據(jù)結(jié)構(gòu)之鏈表的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07

