pandas层次化索引
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
1. 索引的堆(stack)
stack()
unstack()
【小技巧】:使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里;使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
df1 = DataFrame(np.random.randint(0,150,size=(4,6)),
index = list('东南西北'),
columns=[['python','python','math','math','En','En'],['期中','期末','期中','期末','期中','期末']])
df1.stack(level=-1)
df1.stack(level=0)
level代表的是层级,-1代表最内层,stack加ing列索引编程行的最内层索引
df2 = DataFrame(np.random.randint(0,150,size=(8,12)),
columns = pd.MultiIndex.from_product([['模拟考','正式考'],
['数学','语文','英语','物理','化学','生物']]),
index = pd.MultiIndex.from_product([['期中','期末'],
['雷军','李斌'],
['测试一','测试二']]))
df2.unstack() # unstack是将行索引变成列的最内层索引
df2.unstack(level=[0,1,2]) # 若果想把所有的行索引都转换成列索引
# 输出
模拟考 数学 期中 李斌 测试一 81
测试二 79
雷军 测试一 66
测试二 122
期末 李斌 测试一 12
测试二 88
雷军 测试一 87
测试二 97
语文 期中 李斌 测试一 81
测试二 49
雷军 测试一 13
测试二 104
期末 李斌 测试一 68
测试二 28
雷军 测试一 58
测试二 104
英语 期中 李斌 测试一 130
测试二 31
雷军 测试一 125
测试二 89
期末 李斌 测试一 99
测试二 51
雷军 测试一 0
测试二 107
物理 期中 李斌 测试一 43
测试二 66
雷军 测试一 142
测试二 91
期末 李斌 测试一 90
测试二 42
...
正式考 英语 期中 雷军 测试一 49
测试二 124
期末 李斌 测试一 86
测试二 28
雷军 测试一 5
测试二 52
物理 期中 李斌 测试一 46
测试二 109
雷军 测试一 132
测试二 65
期末 李斌 测试一 12
测试二 128
雷军 测试一 63
测试二 26
化学 期中 李斌 测试一 28
测试二 13
雷军 测试一 91
测试二 73
期末 李斌 测试一 67
测试二 6
雷军 测试一 36
测试二 57
生物 期中 李斌 测试一 134
测试二 121
雷军 测试一 44
测试二 58
期末 李斌 测试一 106
测试二 29
雷军 测试一 96
测试二 38
Length: 96, dtype: int32
2. 聚合操作
所谓的聚合操作就是平均数,方差,最大值,最小值……
注意:(1)需要指定axis;
(2)和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。
df3 = DataFrame(np.random.randint(0,150,size=(4,6)),
index = list('东南西北'),
columns=[['python','python','math','math','En','En'],['期中','期末','期中','期末','期中','期末']])
df3.sum(axis=1)
# 输出
东 304
南 558
西 614
北 338
dtype: int64
df3.mean(axis=1) # 平均值
# 输出
东 50.666667
南 93.000000
西 102.333333
北 56.333333
dtype: float64
df3.std(axis=1) # 方差代表数据的波动
# 输出
东 32.922130
南 36.845624
西 23.846733
北 40.662841
dtype: float64
df3.max(axis=1)
# 输出
东 84
南 144
西 135
北 89
dtype: int32
df3.min(axis=0)
# 输出
python 期中 5
期末 2
math 期中 84
期末 4
En 期中 49
期末 20
dtype: int32