1. 數據清洗
1.1 空值和缺失值的處理
?空值一般表示數據未知、不適用或將在以后添加數據。缺失值是指數據集中某個或某些屬性的值是不完整的。
?一般空值使用None表示,缺失值使用NaN表示
1.1.1 使用isnull()和notnull()函數
?可以判斷數據集中是否存在空值和缺失值
1.1.1.1 isnull()語法格式:
pandas . isnull(obj)
1.1.1.2 notnull()語法格式:
pandas . notnull(obj)
?notnull()與 isnull()函數的功能是一樣的,都可以判斷數據中是否存在空值或缺失值,不同處在于,前者發現數據中有空值或缺失值時返回False,后者返回的是True.
1.1.2 使用 dropna()和fillna()方法
?對缺失值進行刪除和填充。
1.1.2.1 dropna()刪除含有空值或缺失值的行或列
?axis:確定過濾行或列
?how:確定過濾的標準,默認是‘any’
?inplase::False=不修改對象本身
1.1.2.2 fillna()方法可以實現填充空值或者缺失值
?value:用于填充的數值,
?method:表示填充方式,默認值為None,‘ffill’前填充,‘bfill’后填充
?limit:可以連續填充的最大數量,默認None.
1.2 重復值的處理
?當數據中出現了重復值,在大多數情況下需要進行刪除。
1.2.1 使用duplicated()和drop_duplicates()方法
?duplicated()方法用于標記是否有重復值。
?drop_duplicates()方法用于刪除重復值。
?它們的判斷標準是一樣的,即只要兩條數中所有條目的值完全相等,就判斷為重復值。
1.2.2 duplicated()方法的語法格式
?subset:用于識別重復的列標簽或列標簽序列,默認識別所有的列標簽。
?keep:刪除重復項并保留第一次出現的項取值可以為 first、last或 False
?duplicated()方法用于標記 Pandas對象的數據是否重復,重復則標記為True,不重復則標記為False,所以該方法返回一個由布爾值組成的Series對象,它的行索引保持不變,數據則變為標記的布爾值
強調注意:
?(1)只有數據表中兩個條目間所有列的內容都相等時,duplicated()方法才會判斷為重復值。
?(2)duplicated()方法支持從前向后( first)和從后向前(last)兩種重復值查找模式,默認是從前向后查找判斷重復值的。換句話說,就是將后出現的相同條目判斷為重復值。
1.2.2.1 drop_duplicates()方法的語法格式
2上述方法中, inplace參數接收一個布爾類型的值,表示是否替換原來的數據,默認為False.
1.3 異常值的處理
?異常值是指樣本中的個別值,其數值明顯偏離它所屬樣本的其余觀測值,這些數值是不合理的或錯誤的。
1.3.1 常用的檢測方法有3σ原則(拉依達準則)和箱形圖
?3σ原則是基于正態分布的數據檢洳而箱形圖沒有什么嚴格的要求,可以檢測任意一組數據,
1.3.1.1 3σ原則
?是指假設一組檢測數據只含有隨機誤差,對其進行計算處理得到標準偏差,按一定概率確定一個區間,凡是超過這個區間的誤差都是粗大誤差,在此誤差的范圍內的數據應予以剔除。
?數值幾乎全部集中在(μ-3σ,μ+3σ)]區間內,超出這個范圍的可能性僅占不到0.3%.所以,凡是誤差超過這個區間的就屬于異常值,應予以剔除
def three_sidma(ser):# ser 為數據的列
mean_value=ser.mean()# 平均值
std_value=ser.std()# 標準值
rule=(sermean_value+3*std_value)
index=np.arange(ser.shape[0])[rule]
outrange=ser.iloc[index]
return outrange
1.3.1.2 箱形圖
?箱開圖是一種用作顯示一組數據分散情況的統計圖。在箱形圖中,異常值通常被定義為小于QL-15QR或大于QU+1.5IQR的值。
?(1)QL稱為下四分位數,表示全部觀察中四分之一的數據取值比它小
?(2)QU稱為上四分位數,表示全部觀察值中有四分之一的數據取值比它大
?(3)IQR稱為四分位數間距,是上四分位數0與下四分位數則之差,其間包含了全部觀察值的一半。
?離散點表示的是異常值,上界表示除異常值以外數據中最大值;下界表示除異常值以外數據中最小值。
boxplot()方法,專門用來繪制箱形圖。
?檢測出異常值后,通常會采用如下四種方式處理這些異常值
?a)直接將含有異常值的記錄刪除。
?b)用具體的值來進行替換,可用前后兩個觀測值的平均值修正該異常值
?c)不處理,直接在具有異常值的數據集上進行統計分析
?d)視為缺失值,利用缺失值的處理方法修正該異常值。
?如果希望對異常值進行修改,則可以使用replace()方法進行替換,該方法不僅可以對單個數據進行替換,也可以多個數據執行批量替換操作。
?to_replace:表示查找被替換值的方式
?value:用來替換任何匹配 to_replace的值,默認值None.
1.4 更改數據類型
?在處理數據時,可能會遇到數據類型不一致的問題。例如,通過爬蟲采集到的數據都是整型的數據,在使用數據時希望保留兩位小數點,這時就需要將數據的類型轉換成浮點型。
?創建 Pandas數據對象時,如果沒有明確地指出數據的類型,則可以根據傳入的數據推斷出來并且通過 dtypes屬性進行查看。
1.4.1 在使用構造方法中的 dtype參數指定數據類型
1.4.2 通過 astype()方法可以強制轉換數據的類型。
?dtype:表示數據的類型。
?errors:錯誤采取的處理方式,可以取值為 raise或 ignore.其中, raise表示允許引發異常ignore表示抑制異常,默認為 raise.
?astype()方法存在著一些局限性,只要待轉換的數據中存在非數字以外的字符,在使用 astype()方法進行類型轉換時就會出現錯誤,而to_numeric()函數的出現正好解決了這個問題。
1.4.3 to_numeric()函數可以將傳入的參數轉換為數值類型。
arg:表示要轉換的數據,可以是list、tuple、 Series.
errors:表示錯誤采取的處理方式。
2. 數據合并
2.1軸向堆疊數據
2.1.1 concat()函數
?concat()函數可以沿著一條軸將多個對象進行堆疊,其使用方式類似數據庫中的數據表合并。
axis:表示連接的軸向,可以為0或1,默認為0
join:表示連接的方式,inner表示內連接, outer表示外連接默認使用外連接。
i gnore_index:如果設置為True,清除現有索引并重置索引值。
names:結果分層索引中的層級的名稱。
?根據軸方向的不同,可以將堆疊分成橫向堆疊與縱向堆疊,默認采用的是縱向堆疊方式。
?在堆疊數據時,默認采用的是外連接(join參數設為 outer)的方式進行合并,當然也可以通過join=inner設置為內連接的方式。
2.2 主鍵合并數據
?主鍵合并類似于關系型數據庫的連接方式,它是指根據個或多個鍵將不同的 DataFrame對象連接起來,大多數是將兩個 DataFrame對象中重疊的列作為合并的鍵。
2.2.1 merge()函數
left:參與合并的左側 DataFrame對象。
right:參與合并的右側 DataFrame對象。
how:表示連接方式,默認為 inner。
2.2.1.1 how參數可以取下列值
left:使用左側的 DataFrame的鍵,類似SQL的左外連接
right:使用右側的 DataFrame的鍵,類似SQL的右外連接
outer:使用兩個 DataFrame所有的鍵,類似SQL的全連接。
inner:使用兩個 DataFrame鍵的交集,類似SQL的內連接
?在使用 merge()函數進行合并時,默認會使用重疊的列索引做為合并鍵,并采用內連接方式合并數據,即取行索引重疊的部分。
?merge()函數還支持對含有多個重疊列的 Data frame對象進行合并。
?使用外連接的方式將 left與right進行合并時,列中相同的數據會重疊,沒有數據的位置使用NaN進行填充。
2.3 根據行索引合并數據
?join()方法能夠通過索引或指定列來連接多個DataFrame對象
2.3.1 join()方法
on:名稱,用于連接列名。
how:可以從{'left‘,’right',' outer‘,'inner'}中任選一個,默認使用左連接的方式。
sort:根據連接鍵對合并的數據進行排序,默認為 False.
2.4 合并重疊數據
?當DataFrame對象中出現了缺失數據,而我們希望使用其他 DataFrame對象中的數據填充缺失數據,則可以通過 combine_first()方法為缺失數據填充。
2.4.1 combine_first()方法
上述方法中只有一個參數 other,該參數用于接收填充缺失值的 DataFrame對象。
注意:使用combine_first()方法合并兩個DataFrame對象時,必須確保它們的行索引和列索引有重疊的部分
3. 數據重塑
3.1 重塑層次化索引
?Pandas中重塑層次化索引的操作主要是 stack()方法和 unstack()方法,前者是將數據的列“旋轉”為行,后者是將數據的行“旋轉”為列。
3.1.1 stack()方法
stack()方法可以將數據的列索引轉換為行索引。
level:默認為-1,表示操作內層索引。若設為0,表示操作外層索引。
dropna:表示是否將旋轉后的缺失值刪除,若設為True,則表示自動過濾缺失值,設置為 False則相反。
3.1.2 unstack()方法
unstack()方法可以將數據的行索引轉換為列索引
level:默認為-1,表示操作內層索引,0表示操作外層索引。
fill_value:若產生了缺失值,則可以設置這個參數用來替換NaN。
3.2 軸向旋轉
?在 Pandas中pivot()方法提供了這樣的功能,它會根據給定的行或列索引重新組織一個 DataFrame對象。
3.2.1 pivot()方法
index:用于創建新 DataFrame對象的行索引。
columns:用于創建新 DataFrame對象的列索引
values:用于填充新 DataFrame對象中的值。
4. 數據轉換
4.1 重命名軸索引
Pandas中提供了一個rename()方法來重命名個別列索引或行索引的標簽或名稱。
4.1.1 rename()方法
index,columns:表示對行索引名或列索引名的轉換。
inplace:默認為False,表示是否返回新的Pandas對象。
4.2 離散化連續數據
Pandas 的 cut ()函數能夠實現離散化操作。
4.2.1 cut ()函數
x:表示要分箱的數組,必須是一維的。
bins:接收int和序列類型的數據。(序列劃分區間)
right:是否包含右端點,決定區間的開閉,默認為True。
?cut()函數會返回一個Categorical對象,我們可以將其看作一組表示 面元名稱 的字符串,它包含了分組的數量以及不同分類的名稱。
?Categories對象中的區間范圍跟數學符號中的“區間”一樣,都是用圓括號表示開區間,用方括號則表示閉區間。
ages=[18,22,25,27,21,23,37,31,60,45,82]
bins=[0,18,25,50,60,100] # bins是一個序列,劃分區間
cuts=pd.cut(ages,bins)
cuts
設置左閉右開區間,則可以在調用cut()函數時傳入right=False進行修改。
# 如果希望設置左右開區間,則可以在調用cut函數時傳入right= False進行修改。
pd.cut(ages,bins=bins,right=False)
# 可以在調用cut函數時指定labels= 用干生成區間的標簽
pd.cut(ages,bins=bins,labels=['少年','青年','中年','中老年','老年'])
4.3 啞變量處理類別型數據
在Pandas中,可以使用get_dummies()函數對類別特征進行啞變量處理.
4.3.1 get_dummies()函數
data:表示啞變量處理的數據。
prefix:表示列名的前綴,默認為None。(‘col’)
prefix_sep:用于附加前綴作為分隔符使用,默認為“_”。
?啞變量又稱應擬變量,名義變量,從名稱上看就知道,它是人為虛設的變量,用來反映某個交量的不間類別
?使用啞變最處理類別轉換,事實上就是將分類變量轉換為啞變最矩陣或指標矩陣,矩陣的值通常用“0”或“1”表示df1=pd.DataFrame({'職業':['工人','學生','司機','教師','導游']})
# get_dummies()對類別特進行啞變量處理
pd.get_dummies(df1)
pd.get_dummies(df1,prefix=['col'])
4.3.2 cut()函數與get_dummies()函數的混合使用
ret=pd.cut(ages,bins=bins,right=False,
labels=['少年','青年','中年','中老年','老年'])
pd.get_dummies(ret,prefix='年齡類別',prefix_sep=':')