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