文章目錄
pandas
缺失值(nan)處理
處理思路
1.思路一
針對數據量比較大的樣本,我們可以直接刪除掉有缺失值的幾行數據即可
2. 思路二
用改行的平均值、中位數等其他指標來對缺失值進行替換
判斷是否存在nan
- pandas.isnull(DataFrame)
非nan返回False,nan返回True - pandas.notnull(DataFrame)
非nan返回True,nan返回False
刪除含nan的樣本
DataFrame.dropna(inplace=False)
- inplace:是否直接在原DataFrame上進行修改,=False表示在原DataFrame上進行修改,=True表示返回新的DataFrame,默認是False
替換/插補
DataFrame.fillna(value,inplace=False)
- value:用於替換nan的值
- inplace:是否直接在原DataFrame上進行修改,=False表示在原DataFrame上進行修改,=True表示返回新的DataFrame,默認是False
實例
-
檢測是否存在nan
方法一
pandas.isnull(DataFrame)會判斷DataFrame裏每個元素值,爲nan返回true,不是nan返回False
numpy.any(values)判斷values裏面的所有值,只要有一個true,就返回true;全爲false就返回false
也就是說,np.any(pd.isnull(data))的結果爲true就說明data裏面含有nan
方法二
pandas.any(values)分別在每個字段裏判斷values,只要有一個true,就返回true;全爲false就返回false,最終返回每個字段的bool值
pd.isnull(data).any()表示,爲true的字段含有nan
pandas.innull()和pandas.notnull()用法一樣,均可用於檢測nan,返回值相反 -
處理nan值
-
刪除含nan的樣本
原文件是20640行,刪除含nan的行後是20433行
-
替換nan值
用該列的平均值或其他指標替換nan之前求得,nan值是在total_bedrooms列上,現在用該列平均值替換nan即可
data[‘total_bedrooms’].fillna(value=data[‘total_bedrooms’].mean(),inplace=True),用total_bedrooms列的平均值替換該列的nan值,最後檢測發現沒有nan
一般來說,刪除nan和替換nan只用其一
-
非nan的缺失值處理
常見的非nan的缺失值,如?、#等
處理思路
- 將其替換成nan
DataFrame.replace(to_replace=,value=)- to_replace:想替換的符號,如’?‘
- value:用於替換的值
用numpy.nan替換?
- 處理nan
見上面 缺失值(nan)處理
數據離散化
什麼是數據離散化
連續屬性的離散化就是在連續屬性的值域上,將值域劃分爲若干個離散的區間,最後用不同的符號或整數值代表落在每個子區間中的屬性值。
例
原始數據:年齡25、58、35…
將年齡分爲幾個階段[18-30),[30-45),[45-60)
這樣就可以將數據分到三個區間,最終變成一個矩陣
[18-30) [30-45) [45-60)
成年 中年 老年
25 1 0 0
58 0 0 1
35 0 1 0
這種數據表示方法就是數據離散化,這種方法叫做one-hot編碼/啞變量
爲什麼要離散化
連續屬性的離散化是爲了簡化數據結構,離散化技術可以用來減少給定連續屬性值的個數,離散化方法經常作爲數據挖掘的工具
數據離散化思路
-
分組
自動分組:pandas.qcut(data,bins)- data:需要分組的數據
- bins:需要分的組數
自定義分組:pandas.cut(data,list)
- data:需要分組的數據
- list:自定義好的分組區間用列表形式傳入
分組完成之後,會返回一個Series
-
將分組好的數據轉化爲one-hot編碼
pandas.get_dummies(series,prefix)- series:之前分組好的序列
- prefix:顯示結果分組的前綴
實例
- 需要處理的數據
- 分組
對原數據進行自動分組
對原數據進行自定義分組
- 將序列轉化爲one-hot編碼
pandas.concat()
pandas.concat([df1,df2],axis=1)
- 按行或列進行合併,axis=0爲列,axis=1爲行
示例
將下列兩個df合併
在df1列上對df2進行合併
在df1行上對df2進行合併
如果兩個df字段不一致的情況下進行列合併,則df2中沒有df1的字段會填充nan,df1中沒有df2的字段也會填充nan
pandas.merge()
pandas.merge(left,right,how=‘inner’,on)
- left:左側表
- right:右側表
- how:連接方式,默認是inner內連接,left左連接,right右連接
- on:連接的字段,用於連接的字段會自動去重
交叉表
交叉表用於計算一列數據對於另外一列數據的分組個數(尋找兩個列之間的關係)
pandas.crosstab(values1,values2)
用ocean_proximity,median_house_value兩列畫交叉表,前者代表與海的距離,後者代表房價
生成的交叉表如圖,
交叉表的索引是ocean_proximity列上的所有取值
透視表
DataFrame.pivot_table([],index)
- []:需要分組的字段
- index:分組之後的索引
直接生成ocean_proximity與對應的平均房價表
分組與聚合
什麼是分組與聚合
分組與聚合是分析數據的一種方式,通常與一些統計函數一起使用,查看數據的分組情況
- 分組:將含有某個或某些共同屬性的數據分到同一個組,如某位學生的各科成績,
- 聚合:將每組的數據求出最大值或最小值就是一個聚合的過程
如何實現分組與聚合
- 分組 DataFrame/Series.groupby(key,as_index=False)
- key:分組的列數據,可以多個
原始數據data3, DataFrame.groupby()
對data3按name進行分,分組的結果並不能直接看到,需要聚合之後才能看到
- 聚合 :求某個統計值就是聚合
對data3聚合,求出每列的最大值
對data3聚合,求出每列的平均值