作者:東哥起飛
雖然雙節(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ú)地隔離每組乘客的,使用這種方法就可以非常簡(jiǎn)單地分析一組乘客。
2、特征重要性/參數(shù)的可視化
如果我們做機(jī)器學(xué)習(xí),那么模型的參數(shù)或者特征的重要性是必不可少的一環(huán)。通常我們會(huì)像下面這樣查看參數(shù),但小數(shù)點(diǎn)太多了,真的容易花眼,這樣非常不便于分析和比較。
所以,我們對(duì)上面代碼稍加改造,用鏈?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í)間長(zhǎng)了我們會(huì)發(fā)現(xiàn)sklearn和pandas搭配有時(shí)候代碼并不是十分整潔,中間的操作環(huán)節(jié)比較多。推薦一個(gè)連接sklearn和pandas的庫(kù)包,它叫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文件,然后再?gòu)?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),需要多久。像我們?cè)陔娔X上復(fù)制粘貼的時(shí)候通常會(huì)顯示需要多久和當(dāng)前的速度,這樣我們提前安排做其它事情還是繼續(xù)等待。
Python中有個(gè)庫(kù)是tqdm,它可以用來跟蹤代碼是否真正在運(yùn)行以及需要花費(fèi)多長(zhǎng)時(shí)間,使用方法很簡(jiǎn)單。
from tqdm import notebook
notebook.tqdm().pandas()
import之后,pandas的dataframe就有了新的方法。
.progress_apply, .progress_applymap
.progress_map
這些方法與apply、applymap和map的使用相同,不同之處是它們將顯示進(jìn)度條。
聯(lián)系客服