pandas层次化索引
1) 隐式构造
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
一、导入相关库
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
二、Series【Series也可以创建多层索引】
① 生成基础Series
s = Series(np.random.randint(0,150,size = 10))
s
output:
0 28
1 147
2 43
3 97
4 21
5 136
6 60
7 97
8 10
9 129
dtype: int32
② 生成多层标题的Series
# 2层,第一层3,第二层2
s2 = Series(np.random.randint(0,150,size = 6),index=pd.MultiIndex.from_arrays([['A','D','B','B','C','C'],
['期中','期末','期中','期末','期中','期末']]))
s2
output:
A 期中 140
D 期末 74
B 期中 53
期末 146
C 期中 103
期末 39
dtype: int32
s2 = Series(np.random.randint(0,150,size = 6),
index=pd.MultiIndex.from_tuples(
[('A','期中'),('A','期末'),('B','期中'),('B','期末'),('C','期中'),('C','期末')]))
s2
output:
A 期中 49
期末 100
B 期中 68
期末 131
C 期中 103
期末 45
dtype: int32
s3 = Series(np.random.randint(0,150,size = 6),index=pd.MultiIndex.from_product([['A','B','C'],['期中','期末']]))
s3
output:
A 期中 51
期末 9
B 期中 145
期末 69
C 期中 66
期末 22
dtype: int32
2) 显示构造pd.MultiIndex
- 使用数组
df = DataFrame(np.random.randint(0,150,size = (6,3)),columns=['Python','数学','En'],
index=pd.MultiIndex.from_arrays(
[['A','A','B','B','C','C'],['期中','期末','期中','期末','期中','期末']]))
df
- 使用tuple
df = DataFrame(np.random.randint(0,150,size = (6,3)),columns=['Python','数学','En'],
index=pd.MultiIndex.from_tuples(
[('A','期中'),('A','期末'),('B','期中'),('B','期末'),('C','期中'),('C','期末')]))
df
- 使用product【最简单,推荐使用】
df = DataFrame(np.random.randint(0,150,size = (6,3)),columns=['Python','数学','En'],
index=pd.MultiIndex.from_product([['A','B','C'],['期中','期末']]))
df
df = DataFrame(np.random.randint(0,150,size = (36,3)),columns=['Python','数学','En'],
index=pd.MultiIndex.from_product(
[['A','B','C'],['期中','期末'],['上','下'],['单元一','单元二','单元三']]))
df
2. 多层列索引
除了行索引index,列索引columns也能用同样的方法创建多层索引
df.columns
output:
Index(['Python', '数学', 'En'], dtype='object')
df.index
output:
MultiIndex(levels=[['A', 'B', 'C'], ['期中', '期末'], ['上', '下'],
['单元一', '单元三', '单元二']],
labels=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1,
1, 1, 0, 0, 0, 1, 1, 1], [0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0,
2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1]])
# 行索引和列索引一样
df = DataFrame(np.random.randint(0,150,size = (6,6)),index=list('abcdef'),
columns=pd.MultiIndex.from_product([['Python','Math','En'],['期中','期末']]))
df
3. 多层索引对象的索引与切片操作
1)Series的操作
【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,因此,推荐使用中括号索引和切片。
(1) 索引
s3
output:
A 期中 51
期末 9
B 期中 145
期末 69
C 期中 66
期末 22
dtype: int32
s3['A','期末']
output: 9
(2) 切片
s3['A':'B']
output:
A 期中 51
期末 9
B 期中 145
期末 69
dtype: int32
# 切片时候,必须从最外层开始
s3['期中':'期末']
output:
Series([], dtype: int32)
s3.iloc[0:3]
output:
A 期中 51
期末 9
B 期中 145
dtype: int32
2)DataFrame的操作
(1) 可以直接使用列名称来进行列索引
(2) 使用行索引需要用ix(),loc()等函数
【极其重要】推荐使用loc()函数
注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
略【详情可查看pandas索引及切片】
4. 索引的堆(stack)
【小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
stack()
unstack()
5. 聚合操作
【注意】
-
需要指定axis
-
【小技巧】和unstack()相同,聚合的时候,axis等于哪一个,那一个就聚合,消失。
所谓的聚合操作:平均数,方差,最大值,最小值……
axis=0是列,axis=1是行
df2.sum(axis = 0)
output:
Python 574
数学 363
En 507
dtype: int64
df2.mean(axis = 1)
output:
小李 期中 93.000000
期末 98.666667
大潘 期中 73.000000
期末 80.000000
王五 期中 100.666667
期末 36.000000
dtype: float64