1. 程式人生 > >03 -3 pandas 層次化索引(隱式構造,顯示構造)、多層列索引、多層索引物件的索引與切片操作(Series的操作,DataFrame的操作)

03 -3 pandas 層次化索引(隱式構造,顯示構造)、多層列索引、多層索引物件的索引與切片操作(Series的操作,DataFrame的操作)

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:

  1. 建立一個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:

  1. 分析比較Series和DataFrame各種索引的方式,熟練掌握.loc()方法
  2. 假設張三再一次在期中考試的時候因為特殊原因放棄英語考試,如何實現?

============================================