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

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

所以,我們對上面代碼稍加改造,用鏈?zhǔn)讲僮魇紫萺ound保留小數(shù)點后兩位數(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ù)或者特征重要性的時候,直接替換字段名就ok了。下面是可視化效果。

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

?
