- 缺失值處理 pandas中的fillna()方法 必要時(shí)設(shè)置索引 填充時(shí)會(huì)自動(dòng)根據(jù)索引填充
- 數(shù)據(jù)透視表 pandas中的pivot_table函數(shù)
describe函數(shù)查看的是 數(shù)值變量的 統(tǒng)計(jì)信息,并未包括 分類變量數(shù)據(jù)的信息
如果需要擦汗分類別量的數(shù)據(jù),需要使用include參數(shù)
titanic_df.describe()#只顯示數(shù)據(jù)類的統(tǒng)計(jì)
titanic_df[["Survived","Age", "SibSp", "Parch"]].describe()#只看部分?jǐn)?shù)據(jù)的統(tǒng)計(jì)量 前面實(shí)際上篩選出了想觀察的數(shù)據(jù)
titanic_df.describe(include=[np.object])#使用include參數(shù) 查看分類變量的統(tǒng)計(jì)信息
#分類變量的統(tǒng)計(jì)信息,
#count 表示非缺失值的個(gè)數(shù)
#unique 非重復(fù)值的個(gè)數(shù)
#top 最高頻值
# 最高頻值出現(xiàn)的的次數(shù)
缺失值處理
- 真實(shí)數(shù)據(jù)往往會(huì)存在缺失值
- 超過百分之六七十的缺失值 我們可以考慮直接丟掉這個(gè)變量 --刪除某列數(shù)據(jù)
- 重要的數(shù)據(jù) 缺失百分之二三十,我們可以考慮用中位數(shù)或者平均值填補(bǔ) --填補(bǔ)缺失值
- 我們一般不提倡去掉帶缺失值的行,因?yàn)榉侨笔е档淖兞靠赡芴峁┯杏玫男畔?--刪除帶缺失值的行
- 使用info函數(shù) 查看數(shù)據(jù)總量 以及各個(gè)變量非空值的個(gè)數(shù),以及變量的類型。大致了解缺失值情況
titanic_df.info() - 在處理某一列之前,可以先查看該列的統(tǒng)計(jì)值 以便處理前后做個(gè)比較
titanic_df.Age.describe() - 使用中位數(shù)填補(bǔ)年齡數(shù)據(jù)中的缺失值
- 計(jì)算中位數(shù)
age_median = titanic_df.Age.median() - 使用fillna填充缺失值 inplace=True表示在原數(shù)據(jù)上直接修改 要對(duì)那一列填充na就點(diǎn)到那一列
titanic_df.Age.fillna(age_median2, inplace=True) - 再查看下統(tǒng)計(jì)值
titanic_df.Age.describe()
實(shí)際情況中,如果考慮更多的分類因素,會(huì)更接近真實(shí)數(shù)據(jù)。比如 考慮性別因素
因?yàn)樘畛鋾r(shí)要依據(jù)性別因素填充,因此 需要將這個(gè)性別這個(gè)屬性作為索引
- 計(jì)算中位數(shù)
分別計(jì)算男女年齡的中位數(shù)
age_median2 = titanic_df.groupby('Sex').Age.median()
上面這行命令,依據(jù)sex分組,分組計(jì)算了年齡的中位數(shù)。得到的結(jié)果是個(gè)Series序列,索引是sex,值是不同性別的中位數(shù)。
在對(duì)源數(shù)據(jù)填充的時(shí)候,也要給源數(shù)據(jù)一個(gè)相同的索引,所以需要對(duì)源數(shù)據(jù)設(shè)置索引
titanic_df.set_index('Sex',inplace=True)
使用fillna填充數(shù)據(jù)時(shí),會(huì)根據(jù)索引進(jìn)行填充
titanic_df.Age.fillna(age_meida2,inplace=True)
填充過之后,要恢復(fù)成原來的樣子,就要重置索引
titanic_df.reset_index(inplace=True)
查看下使用這種填充后統(tǒng)計(jì)量
titanic_df.Age.describe()
索引也可以是多重的,使用多重索引填充時(shí),要保證索引的一致性。
比如分別計(jì)算不同艙位男女年齡的中位數(shù)
age_median3 = titanic_df.groupby(['Pclass', 'Sex']).Age.median()
計(jì)算的結(jié)果其實(shí)只有一個(gè)標(biāo)量 那就是 age的中位數(shù)
而分類依據(jù)是作為索引出現(xiàn)的。age_median3是個(gè)series數(shù)據(jù)
因此在填充時(shí),源數(shù)據(jù)的 這兩個(gè)分類屬性也要作為索引
重設(shè)索引時(shí) 記得使用inplace參數(shù) 保證數(shù)據(jù)在原數(shù)據(jù)上修改
# 設(shè)置索引
titanic_df.set_index(['Pclass','Sex'], inplace=True)
# 填充數(shù)據(jù)
titanic_df.Age.fillna(age_median3, inplace=True)
# 重置索引
titanic_df.reset_index(inplace=True)
數(shù)據(jù)透視表df.pivot_table()
數(shù)據(jù)透視表是就是 在整個(gè)數(shù)據(jù)中 找到需要的數(shù)據(jù) 然后對(duì)數(shù)據(jù) 做一層運(yùn)算
因此有三個(gè)關(guān)鍵參數(shù) value 要操作的數(shù)據(jù) index 把那個(gè)分類屬性作為索引(分組) aggfunc應(yīng)用的計(jì)算
titanic_df.pivot_table(values='Survived', index='Pclass', aggfunc=np.mean)
# 可以根據(jù)多個(gè)篩選條件對(duì)多個(gè)數(shù)據(jù)實(shí)行多個(gè)運(yùn)算
titanic_df.pivot_table(values=['Survived','Age'], index=['Pclass','Sex'], aggfunc=[np.mean,np.max])
pivot_table還有一個(gè)參數(shù)叫做columns 也是個(gè)分類變量,跟index一樣,不同的是會(huì)影響結(jié)果的顯示。
只不過我們將它列在列里而不是行里,這也是為什么這個(gè)變量稱為columns
連續(xù)變量離散化
- 連續(xù)變量離散化是建模的一種常用方法
- 離散化指的是 將某個(gè)變量所在的區(qū)間 分隔成幾個(gè)小區(qū)間 落在同一個(gè)區(qū)間的觀察值用同一個(gè)符號(hào)表示
- 以年齡為例,最小值是0.42(嬰兒),最大值是80,如果我們想產(chǎn)生一個(gè)五個(gè)級(jí)(levels),我們可使用cut或者qcut函數(shù)
- cut函數(shù)將年齡的區(qū)間平均分隔為5份,qcut是讓每個(gè)區(qū)間的觀察值個(gè)數(shù)一樣(5等分)
# 我們使用cut函數(shù)
# 我們可以看到每個(gè)區(qū)間的大小是固定的,大約是16歲
# 這個(gè)函數(shù)的第一個(gè)參數(shù)是 對(duì)誰切割,第二個(gè)參數(shù)是切割幾份
titanic_df['AgeBand'] = pd.cut(titanic_df['Age'], 5)
value_counts函數(shù)的結(jié)果默認(rèn)是排了序的,可以使用sort參數(shù)修改是否對(duì)結(jié)果排序
titanic_df.AgeBand.value_counts(sort=False)
# 同時(shí)繪制不同年齡組的生還概率圖
# 參數(shù)row='AgeBand'表示將不同的年齡區(qū)間的圖按行排列
# 參數(shù)aspect設(shè)置畫布的長寬比
# 參數(shù)palette(調(diào)色板)設(shè)置hue分組的顏色
sns.FacetGrid(data = titanic_df, row='AgeBand', aspect=1.5) \
.map(sns.pointplot, 'Pclass', 'Survived', 'Sex', hue_order=['male', 'female'], palette='deep', ci=None)
#palette 配色參考 https://seaborn.pydata.org/tutorial/color_palettes.html?highlight=palette