5 個(gè)pandas神級操作,最后一個(gè)長見識了!
來源:Python數(shù)據(jù)科學(xué)
作者:東哥起飛
雖然雙節(jié),但東哥還是不忘更新。最近發(fā)現(xiàn)了幾個(gè)pandas的騷操作,小巧實(shí)用,個(gè)個(gè)經(jīng)典,下面快速介紹下。
1、df.groupby().__iter__()分析數(shù)據(jù)樣本
在Jupyter Notebook中通常很難像使用Excel一樣難逐行或逐個(gè)組地瀏覽數(shù)據(jù)集。一個(gè)非常有用的技巧是使用 generator 生成器和Ctrl + Enter組合,而不是我們常規(guī)的Shift + Enter運(yùn)行整個(gè)單元格。這樣做就可以很方便地迭代查看同一單元格中的不同樣本了。
首先在單元格中使用.groupby()(或.iterrows())和.__iter __()創(chuàng)建一個(gè)生成器:
generator?=?df.groupby(['identifier']).__iter__()
然后,根據(jù)自己需要運(yùn)行的次數(shù),使用鍵盤快捷鍵Ctrl +?Enter逐個(gè)查看數(shù)據(jù)。
group_id,?grouped_data?=?generator.__next__()
print(group_id)?
grouped_data
下面是taitanic數(shù)據(jù)集的示例。正常分析的時(shí)候,所有乘客都混在一起,我們是不能單獨(dú)地隔離每組乘客的,使用這種方法就可以非常簡單地分析一組乘客。

2、特征重要性/參數(shù)的可視化
如果我們做機(jī)器學(xué)習(xí),那么模型的參數(shù)或者特征的重要性是必不可少的一環(huán)。通常我們會(huì)像下面這樣查看參數(shù),但小數(shù)點(diǎn)太多了,真的容易花眼,這樣非常不便于分析和比較。

所以,我們對上面代碼稍加改造,用鏈?zhǔn)讲僮魇紫萺ound保留小數(shù)點(diǎn)后兩位數(shù)字,然后sort_values進(jìn)行從大到小的排序,最后用style.bar進(jìn)行可視化,顏色可隨意設(shè)置,這樣不但可以區(qū)分大小,也可區(qū)分正負(fù)。
pd.DataFrame({
????'variable':?variables,
????'coefficient':?model.coef_[0]
})?\
????.round(decimals=2)?\
????.sort_values('coefficient',?ascending=False)?\
????.style.bar(color=['grey',?'lightblue'],?align='zero')
上面這段代碼是可以復(fù)用的,之后每次展示參數(shù)或者特征重要性的時(shí)候,直接替換字段名就ok了。下面是可視化效果。

3、sklearn_pandas
時(shí)間長了我們會(huì)發(fā)現(xiàn)sklearn和pandas搭配有時(shí)候代碼并不是十分整潔,中間的操作環(huán)節(jié)比較多。推薦一個(gè)連接sklearn和pandas的庫包,它叫sklearn_pandas。它將sklearn的ColumnTransformer替換為pandas的DataFrameMapper。用起來無縫連接,和直接使用sklearn的ColumnTransformer毫無區(qū)別。
imputer_Pclass?=?SimpleImputer(strategy='most_frequent',?add_indicator=True)
imputer_Age?=?SimpleImputer(strategy='median',?add_indicator=True)
imputer_SibSp?=?SimpleImputer(strategy='constant',?fill_value=0,?add_indicator=True)
imputer_Parch?=?SimpleImputer(strategy='constant',?fill_value=0,?add_indicator=True)
imputer_Fare?=?SimpleImputer(strategy='median',?add_indicator=True)
imputer_Embarked?=?SimpleImputer(strategy='most_frequent')
scaler_Age?=?MinMaxScaler()
scaler_Fare?=?StandardScaler()
onehotencoder_Sex?=?OneHotEncoder(drop=['male'],?handle_unknown='error')
onehotencoder_Embarked?=?OneHotEncoder(handle_unknown='error')
leaveoneout_encoder?=?LeaveOneOutEncoder(sigma=.1,?random_state=2020)
mapper?=?DataFrameMapper([
????(['Age'],?[imputer_Age,?scaler_Age],?{'alias':'Age_scaled'}),
????(['Pclass'],?[imputer_Pclass]),
????(['SibSp'],?[imputer_SibSp]),
????(['Parch'],?[imputer_Parch]),
????(['Fare'],?[imputer_Fare,?scaler_Fare],?{'alias':?'Fare_scaled'}),
????(['Sex'],?[onehotencoder_Sex],?{'alias':?'is_female'}),
????(['Embarked'],?[imputer_Embarked,?onehotencoder_Embarked]),?
????(['Embarked_Pclass_Sex'],?[leaveoneout_encoder])
],?df_out=True)?
mapper.fit(X=train,?y=train['Survived'])?
下面是fit之后的結(jié)果。

4、.to_clipboard()
經(jīng)過數(shù)據(jù)處理和建模后,通常我們最后會(huì)以csv或者excel格式將數(shù)據(jù)輸出,但有的時(shí)候我們需要匯總數(shù)據(jù),這就需要打開生成的excel文件,然后再復(fù)制粘貼。
但其實(shí)也有更靈活的方法,不通過使用.to_excel方法,也能導(dǎo)出來。pandas還有一個(gè)功能是.to_clipboard(index = False),它可以將數(shù)據(jù)復(fù)制到剪貼板。
然后,我就可以在正在操作的Excel中直接Ctrl + V將數(shù)據(jù)粘貼到當(dāng)前電子表格中,也是另外一種選擇。
5、tqdm
處理大數(shù)據(jù)集時(shí),數(shù)據(jù)處理會(huì)花費(fèi)很多時(shí)間。當(dāng)然,東哥也分享了很多加速運(yùn)行pandas的方法。
安利一個(gè)Python大數(shù)據(jù)分析神器!
臥槽!一個(gè)比 pandas 快百倍的大數(shù)據(jù)分析神器!
12個(gè)Pandas & Numpy函數(shù):數(shù)據(jù)分析提速50%不是問題!
但即使加速了還是要等,Jupyter Notebook運(yùn)行時(shí)有個(gè)缺點(diǎn),就是不知道運(yùn)行的狀態(tài),需要多久。像我們在電腦上復(fù)制粘貼的時(shí)候通常會(huì)顯示需要多久和當(dāng)前的速度,這樣我們提前安排做其它事情還是繼續(xù)等待。
Python中有個(gè)庫是tqdm,它可以用來跟蹤代碼是否真正在運(yùn)行以及需要花費(fèi)多長時(shí)間,使用方法很簡單。
from?tqdm?import?notebook
notebook.tqdm().pandas()
import之后,pandas的dataframe就有了新的方法。
.progress_apply, .progress_applymap
.progress_map
這些方法與apply、applymap和map的使用相同,不同之處是它們將顯示進(jìn)度條。

PS:公號內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起?100 天計(jì)劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!
【神秘禮包獲取方式】
識別文末二維碼,回復(fù):1024


