聲明:此文只是對《對比excel,輕鬆學習python數據分析》這本書的讀書筆記,文章中的代碼均來源於書中,僅以知識分享爲用途,後續我會繼續支持作者,也會繼續讀完這本書,如有侵權,請留言我刪除
數據選擇
之前是把所有的菜品都洗好並放在不同的容器裏,現在要進行切配了。需要吧這些菜品挑選出來,比如做一盤涼拌黃瓜,需要先把黃瓜找出來;數據分析就是你要分析什麼,就把對應的數據篩選出來
常規的數據選擇主要有:列選擇,行選擇,行列同時選擇三種
列選擇
選擇某一列/某幾列
Excel
在Excel中選擇某一列直接用鼠標選中這一列即可;如果要同時選擇多列,且待選擇的列不是相鄰的,這個時候可以先選中其中一列,然後再按住Ctrl鍵不放,再選擇其他列。
Python
import pandas as pd
df = pd.read_excel('04-數據選擇列選擇.xlsx')
在python中我們想要獲取某列只需要在df後邊的方括號中指明要選擇的列明即可,如果是一列,則只需要傳入一個列名,如果是多列,則傳入多個列名,多個列名用list保存起來
df
|
訂單編號 |
客戶姓名 |
SN碼 |
成交時間 |
0 |
A1 |
週一 |
101 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
2018-08-12 |
df['訂單編號']
0 A1
1 A2
2 A3
3 A3
4 A4
5 A5
Name: 訂單編號, dtype: object
df[['訂單編號','客戶姓名']]
|
訂單編號 |
客戶姓名 |
0 |
A1 |
週一 |
1 |
A2 |
吳二 |
2 |
A3 |
鄭三 |
3 |
A3 |
鄭三 |
4 |
A4 |
趙四 |
5 |
A5 |
趙四 |
在Python中我們把通過傳入列名選擇數據的方式稱之爲普通索引。
除了傳入具體的列名,我們還可以傳入具體列的位置,即第幾列,對數據進行選取,通過傳入位置來獲取數據時需要用iloc方法。
df
|
訂單編號 |
客戶姓名 |
SN碼 |
成交時間 |
0 |
A1 |
週一 |
101 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
2018-08-12 |
df.iloc[:, [0, 2]]
|
訂單編號 |
SN碼 |
0 |
A1 |
101 |
1 |
A2 |
102 |
2 |
A3 |
103 |
3 |
A3 |
103 |
4 |
A4 |
104 |
5 |
A5 |
104 |
在上邊的代碼中,iloc後邊的方括號中逗號之前的部分表示要獲取的行的位置,只輸入一個冒號,不輸入任何數值表示獲取所有行。逗號之後的方括號表示要獲取的列的位置,列的位置同樣是從0開始計數。
以上通過傳入具體的位置來選擇數據的方式稱爲位置索引
選擇連續某幾列
Excel
在Excel中,要選擇連續幾列時,直接用鼠標選中這幾列即可操作。當然了,你也可以先選擇一列,然後按住Ctrl鍵再去選擇其他列,由於要選擇的列是連續的,因此無需那麼麻煩
Python
在python中可以通過前面介紹的普通索引和位置索引獲取某一列或多列數據。當你要獲取的是連續某幾列,用普通索引和位置索引也是可以做到的,但是因爲你要獲取的列是連續的,所以只要傳入這些連續列的位置區間即可,同樣需要用到iloc方法
df
df.iloc[:, 0:3]
|
訂單編號 |
客戶姓名 |
SN碼 |
0 |
A1 |
週一 |
101 |
1 |
A2 |
吳二 |
102 |
2 |
A3 |
鄭三 |
103 |
3 |
A3 |
鄭三 |
103 |
4 |
A4 |
趙四 |
104 |
5 |
A5 |
趙四 |
104 |
在上面的代碼中,iloc後的方括號之前的代表選擇的行,當只傳入一個冒號時,表示選擇所有行;逗號後面表示要選擇的列的位置區間,0:3表示選擇第一列到第四列之間的值(包含第 1 列但是不包含第 4 列), 我們把這種通過傳入一個位置區間來獲取數據的方式稱爲切片索引
行選擇
選擇某一行/某幾行
Excel
在Excel中選擇行與選擇列的方式是一樣的,先選擇一行,然後按住Ctrl鍵再選擇其他行
Python
df = pd.read_excel('05-數據選擇行選擇 .xlsx')
在python中,獲取行的主要方式有兩種:
- 普通索引:即傳入具體行索引的名稱,需要用到 loc 方法
- 位置索引:即傳入具體的行數,需要用到 iloc 方法
df
|
訂單編號 |
客戶姓名 |
SN碼 |
成交時間 |
0 |
A1 |
週一 |
101 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
2018-08-12 |
df.loc[0]
訂單編號 A1
客戶姓名 週一
SN碼 101
成交時間 2018-08-08 00:00:00
Name: 0, dtype: object
df
|
訂單編號 |
客戶姓名 |
SN碼 |
成交時間 |
0 |
A1 |
週一 |
101 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
2018-08-12 |
df.iloc[0]
訂單編號 A1
客戶姓名 週一
SN碼 101
成交時間 2018-08-08 00:00:00
Name: 0, dtype: object
df.iloc[[0, 1]]
|
訂單編號 |
客戶姓名 |
SN碼 |
成交時間 |
0 |
A1 |
週一 |
101 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
2018-08-09 |
選擇連續的某幾行
Excel
在Excel中選擇連續的某幾行與選擇連續的某幾行方法一致
Python
在Python中,選擇連續某幾行時,你同樣可以把要選擇的每一個行索引名字或者行索引的位置輸進去。很顯然這樣是沒有必要的,只要把連續行的位置用一個區間表示,然後傳給iloc即可
df
|
訂單編號 |
客戶姓名 |
SN碼 |
成交時間 |
0 |
A1 |
週一 |
101 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
2018-08-12 |
df.iloc[0:3]
|
訂單編號 |
客戶姓名 |
SN碼 |
成交時間 |
0 |
A1 |
週一 |
101 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
2018-08-10 |
選擇滿足條件的行
前兩節獲取某一列時,獲取的是這一列的所有行,我們還可以只篩選出這一列滿足條件的值。
比如年齡這一列,需要吧非異常值(大於200的屬於異常值),即小於200歲的年齡篩選出來,如何實現呢
Excel
在Excel中我們直接使用篩選功能,將滿足條件的值篩選出來
Python
import pandas as pd
df = pd.read_excel('06-篩選滿足條件的行.xlsx')
在python中,我們直接在表名後面指明哪列要滿足什麼條件,就可以把滿足條件的數據篩選出來
df[df['年齡']<200]
|
訂單編號 |
客戶姓名 |
SN碼 |
年齡 |
成交時間 |
0 |
A1 |
週一 |
101 |
31 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
45 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
23 |
2018-08-10 |
我們把上面這種通過傳入一個判斷條件來選擇數據的方式稱爲布爾索引。
傳入的條件還可以是多個,如下爲選擇的年齡小於200且SN碼小於102的數據
df[(df['年齡']<200) & (df['SN碼']<102)]
|
訂單編號 |
客戶姓名 |
SN碼 |
年齡 |
成交時間 |
0 |
A1 |
週一 |
101 |
31 |
2018-08-08 |
行列同時選擇
上面的數據選擇都是針對單一的行或者列進行選擇,實際業務中我們也會用到行,列同時選擇,所謂的行,列同時選擇就是選擇出行和列相交的部分,而在Excel中,是直接通過鼠標拖拽實現的,不再贅述
普通索引 + 普通索引選擇指定的行和列
普通索引 + 普通索引就是通過同時傳入行和列的索引名稱進行數據選擇,需要用loc方法
df
|
訂單編號 |
客戶姓名 |
SN碼 |
年齡 |
成交時間 |
0 |
A1 |
週一 |
101 |
31 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
45 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
23 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
230 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
240 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
250 |
2018-08-12 |
df.loc[[0, 2], ['訂單編號', 'SN碼']]
|
訂單編號 |
SN碼 |
0 |
A1 |
101 |
2 |
A3 |
103 |
loc方法中的第一對方括號表示行索引的選擇,傳入行索引名稱;
loc方法中的第二對方括號表示列索引的選擇,傳入列索引名稱。
位置索引 + 位置索引選擇指定的行和列
位置索引 + 位置索引是通過同時傳入行,列索引的位置來獲取數據,需要用到iloc方法
df
|
訂單編號 |
客戶姓名 |
SN碼 |
年齡 |
成交時間 |
0 |
A1 |
週一 |
101 |
31 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
45 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
23 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
230 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
240 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
250 |
2018-08-12 |
df.iloc[[0, 1], [0, 2]]
|
訂單編號 |
SN碼 |
0 |
A1 |
101 |
1 |
A2 |
102 |
在iloc方法中的第一對方括號表示行索引的選擇, 傳入要選擇行索引的位置;第二對方括號表示列索引的選擇,傳入要選擇的位置索引。
行和列索引的位置都是從0開始計數。
布爾索引 + 普通索引選擇指定的行和列
布爾索引 + 普通索引是先對錶進行布爾索引選擇行,然後通過普通索引選擇列
df
|
訂單編號 |
客戶姓名 |
SN碼 |
年齡 |
成交時間 |
0 |
A1 |
週一 |
101 |
31 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
45 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
23 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
230 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
240 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
250 |
2018-08-12 |
df[df['年齡']<200][['訂單編號', '年齡']]
|
訂單編號 |
年齡 |
0 |
A1 |
31 |
1 |
A2 |
45 |
2 |
A3 |
23 |
上面代碼表示選擇年齡小於200的訂單編號和年齡,先通過布爾索引選擇出年齡小於200的所有行,然後通過普通索引選擇訂單編號和年齡這兩列。
切片索引 + 切片索引選擇指定的行和列
切片索引 + 切片索引是通過同時傳入行,列索引的位置區間進行數據選擇。
df
|
訂單編號 |
客戶姓名 |
SN碼 |
年齡 |
成交時間 |
0 |
A1 |
週一 |
101 |
31 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
45 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
23 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
230 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
240 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
250 |
2018-08-12 |
df.iloc[0:3, 1:3]
|
客戶姓名 |
SN碼 |
0 |
週一 |
101 |
1 |
吳二 |
102 |
2 |
鄭三 |
103 |
切片索引 + 普通索引選擇指定的行和列
前邊我們說過,如果是普通索引,就直接傳入行或列名,用loc方法即可;如果是切片索引,也就是傳入行或列的位置區間,要用iloc方法。如果是切片索引 + 普通索引,也就是行(列)用切片索引,列(行)用普通索引,這種交叉索引要用ix方法
df
|
訂單編號 |
客戶姓名 |
SN碼 |
年齡 |
成交時間 |
0 |
A1 |
週一 |
101 |
31 |
2018-08-08 |
1 |
A2 |
吳二 |
102 |
45 |
2018-08-09 |
2 |
A3 |
鄭三 |
103 |
23 |
2018-08-10 |
3 |
A3 |
鄭三 |
103 |
230 |
2018-08-10 |
4 |
A4 |
趙四 |
104 |
240 |
2018-08-11 |
5 |
A5 |
趙四 |
104 |
250 |
2018-08-12 |
df.ix[0:3, ['客戶姓名', 'SN碼']]
|
客戶姓名 |
SN碼 |
0 |
週一 |
101 |
1 |
吳二 |
102 |
2 |
鄭三 |
103 |
3 |
鄭三 |
103 |