创建多层索引的方法
#用from_product
Series(np.random.randint(0,150,size = 8),index = pd.MultiIndex.from_product([['a','b','c','d'],['期中','期末']]))
Out[23]:
a 期中 51
期末 133
b 期中 132
期末 115
c 期中 65
期末 91
d 期中 30
期末 138
#用from_arrays
Series(np.random.randint(0,150,size = 8),
index = pd.MultiIndex.from_arrays([['a','a','b','b','c','c','d','d'],['期中','期末','期中','期末','期中','期末','期中','期末']]))
df = DataFrame(data = np.random.randint(0,150,size = (8,3)),
columns = ['python','math','english'],
index = pd.MultiIndex.from_product([['a','b','c','d'],['期中','期末']]))
df
#三层也是同理,用乘法原理两两组合就行
Out[33]:
python math english
a 期中 108 14 138
期末 78 136 84
b 期中 16 3 73
期末 116 57 137
c 期中 2 125 124
期末 122 5 53
d 期中 28 101 68
期末 0 66 33
#多层索引可以是行,也可以是列。
df2 = DataFrame(data = np.random.randint(0,150,size = (5,6)),
columns = pd.MultiIndex.from_product([['python','math','english'],['期中','期末']]),
index = list('abcde'))
df2
Out[34]:
python math english
期中 期末 期中 期末 期中 期末
a 74 83 24 149 13 35
b 43 132 141 51 106 66
c 137 45 107 140 38 124
d 14 117 106 115 5 16
e 69 73 44 122 53 35
多层索引的索引切片,和之前的规则类似
df.iloc[0]
Out[5]:
python 2
math 43
english 118
Name: (a, 期中), dtype: int32
df.loc['a','期末']['python']#索引某个元素
df['a':'c']#切片
Out[6]:
python math english
a 期中 2 43 118
期末 63 140 85
b 期中 117 0 94
期末 22 126 82
c 期中 123 24 0
期末 19 85 146
df.iloc[0:3]
Out[7]:
python math english
a 期中 2 43 118
期末 63 140 85
b 期中 117 0 94
#聚合操作
df.mean(axis = 0,level = 0)#用level确定对第几层索引进行聚合函数
Out[9]:
python math english
a 32.5 91.5 101.5
b 69.5 63.0 88.0
c 71.0 54.5 73.0
d 63.0 85.5 119.0
df.mean(axis = 0,level = 1)
Out[10]:
python math english
期中 73.5 22.50 76.00
期末 44.5 124.75 114.75
#索引的堆
df.unstack()#行变列
python math english
期中 期末 期中 期末 期中 期末
a 2 63 43 140 118 85
b 117 22 0 126 94 82
c 123 19 24 85 0 146
d 52 74 23 148 92 146
df2.stack()#列变行
Out[12]:
english math python
a 期中 74 54 49
期末 109 73 39
b 期中 137 54 128
期末 107 84 138
c 期中 80 149 127
期末 142 19 40
d 期中 132 64 70
期末 83 132 107
e 期中 36 147 97
期末 137 128 79
df.unstack(level = 0)#如果有很多层索引df.unstack(level = [0,1])可换多层索引
Out[13]:
python math english
a b c d a b c d a b c d
期中 2 117 123 52 43 0 24 23 118 94 0 92
期末 63 22 19 74 140 126 85 148 85 82 146 146
##使用stack或unstack时,level = 什么,什么就消失,出现在行/列里