Pandas 數據清洗的具體使用
數據清洗是對一些沒有用的數據進行處理的過程。很多數據集存在數據缺失、數據格式錯誤、錯誤數據或重復數據的情況,如果要使數據分析更加準確,就需要對這些沒有用的數據進行處理。數據清洗與預處理的常見步驟:
- 缺失值處理:識別并填補缺失值,或刪除含缺失值的行/列。
- 重復數據處理:檢查并刪除重復數據,確保每條數據唯一。
- 異常值處理:識別并處理異常值,如極端值、錯誤值。
- 數據格式轉換:轉換數據類型或進行單位轉換,如日期格式轉換。
- 標準化與歸一化:對數值型數據進行標準化(如 Z-score)或歸一化(如 Min-Max)。
- 類別數據編碼:將類別變量轉換為數值形式,常見方法包括 One-Hot 編碼和標簽編碼。
- 文本處理:對文本數據進行清洗,如去除停用詞、詞干化、分詞等。
- 數據抽樣:從數據集中抽取樣本,或通過過采樣/欠采樣處理類別不平衡。
- 特征工程:創(chuàng)建新特征、刪除不相關特征、選擇重要特征等。
本文使用到的測試數據 property-data.csv 如下:
上表包含了四種空數據:
- n/a
- NA
- —
- na
1 Pandas 清洗空值
如果我們要刪除包含空字段的行,可以使用 dropna() 方法,語法格式如下:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
- axis:默認為 0,表示逢空值剔除整行,如果設置參數 axis=1 表示逢空值去掉整列。
- how:默認為 'any' 如果一行(或一列)里任何一個數據有出現(xiàn) NA 就去掉整行,如果設置 how='all' 一行(或列)都是 NA 才去掉這整行。
- thresh:設置需要多少非空值的數據才可以保留下來的。
- subset:設置想要檢查的列。如果是多個列,可以使用列名的 list 作為參數。
- inplace:如果設置 True,將計算得到的值直接覆蓋之前的值并返回 None,修改的是源數據。
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 當作空數據,不符合我們要求,我們可以指定空數據類型:
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() 刪除包含空數據的行
接下來的實例演示了刪除包含空數據的行。
import pandas as pd df = pd.read_csv('property-data.csv') new_df = df.dropna() print(new_df.to_string())
默認情況下,dropna() 方法返回一個新的 DataFrame,不會修改源數據。如果你要修改源數據 DataFrame, 可以使用 inplace = True 參數:
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())
我們也可以指定某一個列來替換數據,例如使用 12345 替換 PID 為空數據:
df.fillna({ 'PID' : 12345 }, inplace = True)
替換空單元格的常用方法是計算列的均值、中位數值或眾數。Pandas使用 mean()、median() 和 mode() 方法計算列的均值(所有值加起來的平均值)、中位數值(排序后排在中間的數)和眾數(出現(xiàn)頻率最高的數)。
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())
以上實例輸出結果如下,紅框為計算的中位數替換來空單元格:
1.3.2 median() 中位數替換
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() 眾數替換
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 清洗格式錯誤數據
數據格式錯誤的單元格會使數據分析變得困難,甚至不可能。我們可以通過包含空單元格的行,或者將列中的所有單元格轉換為相同格式的數據。以下實例會格式化日期:
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 清洗錯誤數據
數據錯誤也是很常見的情況,我們可以對錯誤的數據進行替換或移除。以下實例會替換錯誤年齡的數據:
import pandas as pd person = { "name": ['Google', 'Bing', 'Taobao'], "age": [50, 40, 12345] # 12345 年齡數據是錯誤的 } df = pd.DataFrame(person) df.loc[2, 'age'] = 30 # 修改數據 print(df.to_string())
也可以設置條件語句,例如將 age 大于 120 的設置為 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())
也可以將錯誤數據的行刪除,例如將 age 大于 120 的刪除:
import pandas as pd person = { "name": ['Google', 'Runoob', 'Taobao'], "age": [50, 40, 12345] # 12345 年齡數據是錯誤的 } 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 清洗重復數據
如果我們要清洗重復數據,可以使用 duplicated() 和 drop_duplicates() 方法。如果對應的數據是重復的,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())
刪除重復數據,可以直接使用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 常用方法及說明
操作 | 方法/步驟 | 說明 | 常用函數/方法 |
---|---|---|---|
缺失值處理 | 填充缺失值 | 使用指定的值(如均值、中位數、眾數等)填充缺失值。 | df.fillna(value) |
刪除缺失值 | 刪除包含缺失值的行或列。 | df.dropna() | |
重復數據處理 | 刪除重復數據 | 刪除 DataFrame 中的重復行。 | df.drop_duplicates() |
異常值處理 | 異常值檢測(基于統(tǒng)計方法) | 通過 Z-score 或 IQR 方法識別并處理異常值。 | 自定義函數(如基于 Z-score 或 IQR) |
替換異常值 | 使用合適的值(如均值或中位數)替換異常值。 | 自定義函數(如替換異常值) | |
數據格式轉換 | 轉換數據類型 | 將數據類型從一個類型轉換為另一個類型,如將字符串轉換為日期。 | df.astype() |
日期時間格式轉換 | 轉換字符串或數字為日期時間類型。 | pd.to_datetime() | |
標準化與歸一化 | 標準化 | 將數據轉換為均值為0,標準差為1的分布。 | StandardScaler() |
歸一化 | 將數據縮放到指定的范圍(如 [0, 1])。 | MinMaxScaler() | |
類別數據編碼 | 標簽編碼 | 將類別變量轉換為整數形式。 | LabelEncoder() |
獨熱編碼(One-Hot Encoding) | 將每個類別轉換為一個新的二進制特征。 | pd.get_dummies() | |
文本數據處理 | 去除停用詞 | 從文本中去除無關緊要的詞,如 "the" 、 "is" 等。 | 自定義函數(基于 nltk 或 spaCy ) |
詞干化與詞形還原 | 提取詞干或恢復單詞的基本形式。 | nltk.stem.PorterStemmer() | |
分詞 | 將文本分割成單詞或子詞。 | nltk.word_tokenize() | |
數據抽樣 | 隨機抽樣 | 從數據中隨機抽取一定比例的樣本。 | df.sample() |
上采樣與下采樣 | 通過過采樣(復制少數類樣本)或欠采樣(減少多數類樣本)來平衡數據集中的類別分布。 | SMOTE() (上采樣); RandomUnderSampler() (下采樣) | |
特征工程 | 特征選擇 | 選擇對目標變量有影響的特征,去除冗余或無關特征。 | SelectKBest() |
特征提取 | 從原始數據中創(chuàng)建新的特征,提升模型的預測能力。 | PolynomialFeatures() | |
特征縮放 | 對數值特征進行縮放,使其具有相同的量級。 | MinMaxScaler() 、 StandardScaler() | |
類別特征映射 | 特征映射 | 將類別變量映射為對應的數字編碼。 | 自定義映射函數 |
數據合并與連接 | 合并數據 | 將多個 DataFrame 按照某些列合并在一起,支持內連接、外連接、左連接、右連接等。 | pd.merge() |
連接數據 | 將多個 DataFrame 進行行或列拼接。 | pd.concat() | |
數據重塑 | 數據透視表 | 將數據根據某些維度進行分組并計算聚合結果。 | pd.pivot_table() |
數據變形 | 改變數據的形狀,如從長格式轉為寬格式或從寬格式轉為長格式。 | df.melt() 、 df.pivot() | |
數據類型轉換與處理 | 字符串處理 | 對字符串數據進行處理,如去除空格、轉換大小寫等。 | str.replace() 、 str.upper() 等 |
分組計算 | 按照某個特征分組后進行聚合計算。 | df.groupby() | |
缺失值預測填充 | 使用模型預測填充缺失值 | 使用機器學習模型(如回歸模型)預測缺失值,并填充缺失數據。 | 自定義模型(如 sklearn.linear_model.LinearRegression ) |
時間序列處理 | 時間序列缺失值填充 | 使用時間序列的方法(如前向填充、后向填充)填充缺失值。 | df.fillna(method='ffill') |
滾動窗口計算 | 使用滑動窗口進行時間序列數據的統(tǒng)計計算(如均值、標準差等)。 | df.rolling(window=5).mean() | |
數據轉換與映射 | 數據映射與替換 | 將數據中的某些值替換為其他值。 | df.replace() |
到此這篇關于Pandas 數據清洗的具體使用的文章就介紹到這了,更多相關Pandas 數據清洗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
pycharm遠程連接服務器并配置python interpreter的方法
這篇文章主要介紹了pycharm遠程連接服務器并配置python interpreter的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12python實現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息
這篇文章主要介紹了python實現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息的方法,是非常實用的技巧,涉及到文件的讀寫與字典的操作等技巧,需要的朋友可以參考下2014-09-09python實現(xiàn)爬蟲統(tǒng)計學校BBS男女比例之多線程爬蟲(二)
這篇文章主要介紹了python實現(xiàn)爬蟲統(tǒng)計學校BBS男女比例之多線程爬蟲,感興趣的小伙伴們可以參考一下2015-12-12jupyter notebook oepncv 顯示一張圖像的實現(xiàn)
這篇文章主要介紹了jupyter notebook oepncv 顯示一張圖像的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04