03 -3 pandas 層次化索引(隱式構造,顯示構造)、多層列索引、多層索引物件的索引與切片操作(Series的操作,DataFrame的操作)
阿新 • • 發佈:2018-11-08
pandas層次化索引
多級索引包括: 多級行索引 和 多級列索引
1. 建立多層行索引
1) 隱式構造
最常見的方法是給DataFrame建構函式的index引數傳遞兩個或更多的陣列
- Series也可以建立多層索引
import numpy as np import pandas as pd from pandas import Series,DataFrame index = [np.array(["期中","期中","期末","期末"]),np.array(["語文","英語","語文","英語"])] Series(np.random.randn(4),index=index) 結果為: 期中 語文 1.040276 英語 0.456647 期末 語文 0.583853 英語 0.348378 dtype: float64
2) 顯示構造pd.MultiIndex
- 使用陣列
index = pd.MultiIndex.from_arrays([["期中","期中","期中","期末","期末","期末"],["語文","英語","數學","語文","英語","數學"]])
columns = ["張三","李四","王五","趙柳"]
data = np.random.randint(0,150,size=(6,4))
DataFrame(data,index,columns)
張三 | 李四 | 王五 | 趙柳 | ||
---|---|---|---|---|---|
期中 | 語文 | 12 | 146 | 61 | 121 |
英語 | 120 | 119 | 100 | 68 | |
數學 | 73 | 80 | 40 | 102 | |
期末 | 語文 | 90 | 143 | 51 | 85 |
英語 | 6 | 35 | 62 | 90 | |
數學 | 32 | 60 | 114 | 149 |
- 使用tuple
index = pd.MultiIndex.from_tuples([("期中","語文"),("期中","數學"),("期中","英語"),("期末","語文"),("期末","數學"),("期末","英語")])
columns = ["張三","李四","王五","趙柳"]
data = np.random.randint(0,150,size=(6,4))
DataFrame(data,index,columns)
張三 | 李四 | 王五 | 趙柳 | ||
---|---|---|---|---|---|
期中 | 語文 | 0 | 40 | 95 | 1 |
數學 | 112 | 137 | 32 | 65 | |
英語 | 84 | 81 | 74 | 104 | |
期末 | 語文 | 146 | 125 | 44 | 51 |
數學 | 146 | 55 | 62 | 137 | |
英語 | 80 | 24 | 129 | 77 |
-
使用product
最簡單,推薦使用
index = pd.MultiIndex.from_product([["期中","期末"],["語文","數學","英語"]])
columns = ["張三","李四","王五","趙柳"]
data = np.random.randint(0,150,size=(6,4))
df2 = DataFrame(data,index,columns)
df2
張三 | 李四 | 王五 | 趙柳 | ||
---|---|---|---|---|---|
期中 | 語文 | 117 | 85 | 77 | 38 |
數學 | 119 | 108 | 121 | 130 | |
英語 | 6 | 96 | 126 | 133 | |
期末 | 語文 | 125 | 87 | 133 | 113 |
數學 | 84 | 112 | 28 | 26 | |
英語 | 132 | 43 | 126 | 104 |
============================================
練習8:
- 建立一個DataFrame,表示出張三李四期中期末各科成績
============================================
data = np.random.randint(0,150,size=(4,2))
index= pd.MultiIndex.from_product([["期中","期末"],["語文","英語"]])
columns = ["張三","李四"]
DataFrame(data,index,columns)
張三 | 李四 | ||
---|---|---|---|
期中 | 語文 | 14 | 149 |
英語 | 97 | 84 | |
期末 | 語文 | 4 | 124 |
英語 | 7 | 27 |
2. 多層列索引
除了行索引index,列索引columns也能用同樣的方法建立多層索引
data = np.random.randint(0,150,size=(2,4))
index= pd.MultiIndex.from_product([["期中","期末"],["語文","英語"]]) # 多層索引
columns = ["張三","李四"] #單層索引
df1 = DataFrame(data=data,index=columns,columns=index)
期中 | 期末 | |||
---|---|---|---|---|
語文 | 英語 | 語文 | 英語 | |
張三 | 50 | 12 | 89 | 99 |
李四 | 119 | 9 | 133 | 102 |
3. 多層索引物件的索引與切片操作
1)Series的操作
【重要】對於Series來說,直接中括號[]與使用.loc()完全一樣,推薦使用.loc中括號索引和切片。
(1) 索引
df2
張三 | 李四 | 王五 | 趙柳 | ||
---|---|---|---|---|---|
期中 | 語文 | 117 | 85 | 77 | 38 |
數學 | 119 | 108 | 121 | 130 | |
英語 | 6 | 96 | 126 | 133 | |
期末 | 語文 | 125 | 87 | 133 | 113 |
數學 | 84 | 112 | 28 | 26 | |
英語 | 132 | 43 | 126 | 104 |
從列入手
df2["張三"] # 找出來的是個Series 這個Series有多重行索引
結果為:
期中 語文 117
數學 119
英語 6
期末 語文 125
數學 84
英語 132
Name: 張三, dtype: int32
type(df2["張三"])
結果為:pandas.core.series.Series
df2["張三"].loc["期中"].loc["語文"]
結果為:117
從行入手
df2.loc["期中"]["張三"]
結果為:
語文 117
數學 119
英語 6
Name: 張三, dtype: int32
df2.loc["期中"].loc["語文"]
結果為:
張三 117
李四 85
王五 77
趙柳 38
Name: 語文, dtype: int32
(2) 切片
df2[0:4]
張三 | 李四 | 王五 | 趙柳 | ||
---|---|---|---|---|---|
期中 | 語文 | 117 | 85 | 77 | 38 |
數學 | 119 | 108 | 121 | 130 | |
英語 | 6 | 96 | 126 | 133 | |
期末 | 語文 | 125 | 87 | 133 | 113 |
2)DataFrame的操作
data = np.random.randint(0,150,size=(6,6))
index = pd.MultiIndex.from_product([["期中","期末"],["語文","數學","英語"]])
columns = pd.MultiIndex.from_product([["一班","二班"],["01","02","03"]])
df1 = DataFrame(data=data,index=index,columns=columns)
df1
一班 | 二班 | ||||||
---|---|---|---|---|---|---|---|
01 | 02 | 03 | 01 | 02 | 03 | ||
期中 | 語文 | 21 | 19 | 135 | 105 | 53 | 126 |
數學 | 75 | 67 | 8 | 103 | 93 | 125 | |
英語 | 63 | 76 | 65 | 78 | 78 | 39 | |
期末 | 語文 | 65 | 47 | 26 | 34 | 95 | 33 |
數學 | 135 | 55 | 78 | 125 | 92 | 56 | |
英語 | 21 | 136 | 84 | 72 | 13 | 27 |
(1) 可以直接使用列名稱來進行列索引
df1["一班"] # 開始的時候只能傳 最外層的
01 | 02 | 03 | ||
---|---|---|---|---|
期中 | 語文 | 21 | 19 | 135 |
數學 | 75 | 67 | 8 | |
英語 | 63 | 76 | 65 | |
期末 | 語文 | 65 | 47 | 26 |
數學 | 135 | 55 | 78 | |
英語 | 21 | 136 | 84 |
df1["01"]
結果為:
期中 語文 92
數學 124
英語 4
期末 語文 104
數學 8
英語 135
Name: 01, dtype: int32
df1["一班"]["01"]
與上面結果保持一致
行多級索引的索引和切片操作
df1.loc["期中"] # 一開始的時候只能找最外層的
一班 | 二班 | |||||
---|---|---|---|---|---|---|
01 | 02 | 03 | 01 | 02 | 03 | |
語文 | 21 | 19 | 135 | 105 | 53 | 126 |
數學 | 75 | 67 | 8 | 103 | 93 | 125 |
英語 | 63 | 76 | 65 | 78 | 78 | 39 |
df1.loc["語文"]
df1.loc["期中"].loc["語文"]
df1.loc["期中"][0:2]
一班 | 二班 | |||||
---|---|---|---|---|---|---|
01 | 02 | 03 | 01 | 02 | 03 | |
語文 | 21 | 19 | 135 | 105 | 53 | 126 |
數學 | 75 | 67 | 8 | 103 | 93 | 125 |
df1.loc["期中"].iloc[:,0:2]
一班 | ||
---|---|---|
01 | 02 | |
語文 | 21 | 19 |
數學 | 75 | 67 |
英語 | 63 | 76 |
(2) 使用行索引需要用loc()等函式
【重要】推薦使用loc()函式
============================================
練習9:
- 分析比較Series和DataFrame各種索引的方式,熟練掌握.loc()方法
- 假設張三再一次在期中考試的時候因為特殊原因放棄英語考試,如何實現?
============================================