序言
學習了Pandas的同學,有超過60%仍然投向了Excel的懷抱,之所以做此下策,多半是因爲剛開始用Python處理數據時,選擇想要的行和列實在太痛苦
,完全沒有Excel想要哪裏點哪裏的快感。
初識Pandas 教程考慮到篇幅問題只講了最基礎的列向索引,但這顯然不能滿足同志們日益增長的個性化服務(選取)需求。爲了舒緩痛感,增加快感,滿足需求,第二篇內容我們單獨把索引
拎出來,結合場景詳細介紹兩種常用的索引方式:
第一種是基於位置(整數)的索引,案例短平快,有個粗略的瞭解即可,實際中偶有用到,但它的應用範圍不如第二種廣泛。
第二種是基於名稱(標籤)的索引,這是要敲黑板練的重點,因爲它將是我們後面進行數據清洗和分析的重要基石。
首先,簡單介紹一下練習的案例數據:
流量來源 | 來源明細 | 訪客數 | 支付轉化率 | 客單價 |
---|---|---|---|---|
一級 | -A | 35188 | 9.98% | 54.3 |
一級 | -B | 28467 | 11.27% | 99.93 |
一級 | -C | 13747 | 2.54% | 0.08 |
一級 | -D | 5183 | 2.47% | 37.15 |
一級 | -E | 4361 | 4.31% | 91.73 |
一級 | -F | 4063 | 11.57% | 65.09 |
一級 | -G | 2122 | 10.27% | 86.45 |
一級 | -H | 2041 | 7.06% | 44.07 |
一級 | -I | 1991 | 16.52% | 104.57 |
一級 | -J | 1981 | 5.75% | 75.93 |
一級 | -K | 1958 | 14.71% | 85.03 |
一級 | -L | 1780 | 13.15% | 98.87 |
一級 | -M | 1447 | 1.04% | 80.07 |
二級 | -A | 39048 | 11.60% | 91.91 |
二級 | -B | 3316 | 7.09% | 66.28 |
二級 | -C | 2043 | 5.04% | 41.91 |
三級 | -A | 23140 | 9.69% | 83.75 |
三級 | -B | 14813 | 20.14% | 82.97 |
四級 | -A | 216 | 1.85% | 94.25 |
四級 | -B | 31 | 0.00% | |
四級 | -C | 17 | 0.00% | |
四級 | -D | 3 | 0.00% |
和第一篇數據集一樣,記錄着不同流量來源下,各渠道來源明細所對應的訪客數、支付轉化率和客單價。數據集雖然簡短(複雜的案例數據集在基礎篇完結後會如約而至),但是有足夠的代表性,下面開始我們索引的表演。
1. 基於位置(數字)的索引
先看一下索引的操作方式:
df.iloc[行索引,列索引]
第一個位置是行索引,輸入我們要取哪幾行位置的參數
第二個位置是列索引,輸入我們要取哪幾列的位置參數
我們需要根據實際情況,填入對應的行參數和列參數。
場景一(行選取)
目標
:選擇流量來源
等於一級
的所有行。
思路
:手指戳屏幕數一數,一級的渠道,是從第1行到第13行,對應行索引是0-12,但Python切片默認是含首不含尾的,要想選取0-12的索引行,我們得輸入0:13
,列想要全部選取,則輸入冒號:
即可。
場景二(列選取)
目標
:我們想要把所有渠道的流量來源和客單價單拎出來看一看。
思路
:所有流量渠道,也就是所有行,在第一個行參數的位置我們輸入:
;再看列,流量來源是第1列,客單價是第5列,對應的列索引分別是0和4:
值得注意的是,如果我們要跨列選取,得先把位置參數構造成列表形式,這裏就是[0,4],如果是連續選取
,則無需構造成列表,直接輸入0:5
(選取索引爲0的列到索引爲4的列)就好。
場景三(行列交叉選取)
目標:我們想要看一看二級、三級流量來源、來源明細對應的訪客和支付轉化率
思路:先看行,二級三級渠道對應行索引是13:17,再次強調索引含首不含尾
的原則,我們傳入的行參數是13:18;列的話我們需要流量來源、來源明細、訪客和轉化,也就是前4列,傳入參數0:4。
2. 基於名稱(標籤)的索引
爲了建立起橫向對比的體感,我們依然沿用上面三個場景。
場景一:選擇一級渠道的所有行。
思路:這次我們不用一個個數位置了,要篩選流量渠道爲一級
的所有行,只需做一個判斷,判斷流量來源這一列,哪些值等於一級
。
返回的結果由True和False(布爾型)構成,在這個例子中分別代表結果等於一級和非一級。在loc方法中,我們可以把這一列判斷得到的值傳入行參數位置,Pandas會默認返回結果爲True的行(這裏是索引從0到12的行),而丟掉結果爲False的行,直接上例子:
場景二:我們想要把所有渠道的流量來源和客單價單拎出來看一看。
思路
:所有渠道等於所有行,我們在行參數位置直接輸入:
,要提取流量來源和客單價列,直接輸入名稱到列參數位置,由於這裏涉及到兩列,所以得用列表包起來:
場景三:我們想要提取二級、三級流量來源、來源明細對應的訪客和支付轉化率。
思路
:行提取用判斷,列提取輸入具體名稱參數。
df2.loc[df2['流量來源'].isin(['二級','三級']),['流量來源','來源明細','訪客數','支付轉化率']]
此處插播一條isin
函數的廣告,這個函數能夠幫助我們快速判斷源數據中某一列(Series)的值是否等於列表中的值。拿案例來說,df[‘流量來源’].isin([‘二級’,‘三級’]),判斷的是流量來源這一列的值,是否等於“二級”或者“三級”,如果等於(等於任意一個)就返回True,否則返回False。我們再把這個布爾型判斷結果傳入行參數,就能夠很容易的得到流量來源等於二級或者三級的渠道。
既然loc的應用場景更加廣泛,應該給他加個雞腿,再來個接地氣的場景練練手。
插入場景之前,我們先花30秒的時間捋一捋Pandas中列(Series)向求值的用法,具體操作如下:
df2['訪客數'].mean()
df2['訪客數'].std()
df2['訪客數'].median()
df2['訪客數'].max()
df2['訪客數'].min()
只需要加個尾巴,均值、標準差等統計數值就出來了,瞭解完這個,下面正式進入場景四。
場景四:對於流量渠道數據,我們真正應該關注的是優質渠道,假如這裏我們定義訪客數、轉化率、客單價都高於平均值渠道是優質渠道,那怎麼找到這些渠道呢?
思路:優質渠道,得同時滿足訪客、轉化、客單高於平均值這三個條件,這是解題的關鍵。先看看均值各是多少:
再判斷各指標列是否大於均值:
df2['訪客數'] > df2['訪客數'].mean()
df2['支付轉化率']> df2['支付轉化率'].mean()
df2['客單價'] > df2['客單價'].mean()
要三個條件同時滿足,他們之間是一個“且”的關係(同時滿足),在pandas中,要表示同時滿足,各條件之間要用&
符號連接,條件內部最好用括號區分;如果是或
的關係(滿足一個即可),則用|
符號連接:
(df2['訪客數'] > df2['訪客數'].mean())&(df2['支付轉化率']> df2['支付轉化率'].mean())&(df2['客單價'] > df2['客單價'].mean())
這樣連接之後,返回True則表示該渠道同時滿足訪客、轉化率、客單價都高於均值的條件,接下來我們只需要把這些值傳入到行參數的位置。
df2.loc[(df2['訪客數'] > df2['訪客數'].mean())&(df2['支付轉化率']> df2['支付轉化率'].mean())&(df2['客單價'] > df2['客單價'].mean()),:]
到這一步,我們直接篩選出了4條關鍵指標都高於均值的優質渠道。
這兩種索引方式,分別是基於位置(數字)的索引
和基於名稱(標籤)的索引
,關鍵在於把腦海中想要選取的行和列,映射到對應的行參數與列參數中去。
只要稍加練習,我們就能夠隨心所欲的用pandas處理和分析數據,邁過了這一步之後,你會發現和Excel相比,Python是如此的美豔動人。