pandas层次化索引
1. 创建多层行索引
1) 隐式构造
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
- Series也可以创建多层索引
import
numpy
as
np
import
pandas
as
pd
from
pandas
import
Series
,
DataFrame
s
=
Series
([
1
,
2
,
3
,
4
],
index
=
[[
'a'
,
'a'
,
'b'
,
'b'
],[
'期中'
,
'期末'
,
'期中'
,
'期末'
]]
)
s
df
=
DataFrame
(
data
=
np
.
random
.
randint
(
0
,
150
,
size
=
(
6
,
3
)),
columns
=
[
'语文'
,
'数学'
,
'python'
],
index
=
[[
'Michael'
,
'Michael'
,
'Lisa'
,
'Lisa'
,
'Po'
,
'Po'
],[
'期中'
,
'期末'
,
'期中'
,
'期末'
,
'期中'
,
'期末'
]])
#隐式创建
df
2) 显示构造pd.MultiIndex
- 使用数组
df1
=
DataFrame
(
data
=
np
.
random
.
randint
(
0
,
150
,
size
=
(
6
,
3
)),
columns
=
[
"Java"
,
'Html5'
,
'Python'
],
index
=
pd
.
MultiIndex
.
from_arrays
([[
'张三'
,
'张三'
,
'李四'
,
'李四'
,
'Michael'
,
'Michael'
],[
'期中'
,
'期末'
,
'期中'
,
'期末'
,
'期中'
,
'期末'
]]))
df1
- 使用tuple
df2
=
DataFrame
(
data
=
np
.
random
.
randint
(
0
,
150
,
size
=
(
6
,
4
)),
columns
=
[
"Spring"
,
'Summer'
,
'Autumn'
,
'Winter'
],
index
=
pd
.
MultiIndex
.
from_tuples
([(
'张三'
,
'期中'
),(
'张三'
,
'期末'
),(
'李四'
,
'期中'
),(
'李四'
,
'期末'
),(
'Sara'
,
'期中'
),(
'Sara'
,
'期末'
)]))
df2
-
使用product
最简单,推荐使用
df3
=
DataFrame
(
data
=
np
.
random
.
randint
(
0
,
150
,
size
=
(
12
,
4
)),
columns
=
[
"Spring"
,
'Summer'
,
'Autumn'
,
'Winter'
],
index
=
pd
.
MultiIndex
.
from_product
([[
'张三'
,
'Sara'
,
'Lisa'
],[
'middle'
,
'end'
],
list
(
'AB'
)]))
df3
============================================
练习8:
- 创建一个DataFrame,表示出张三李四期中期末各科成绩
============================================
2. 多层列索引
除了行索引index,列索引columns也能用同样的方法创建多层索引
df4
=
DataFrame
(
data
=
np
.
random
.
randint
(
0
,
150
,
size
=
(
4
,
12
)),
columns
=
pd
.
MultiIndex
.
from_product
([[
'张三'
,
'Sara'
,
'Lisa'
],[
'middle'
,
'end'
],
list
(
'AB'
)]),
index
=
[
"Spring"
,
'Summer'
,
'Autumn'
,
'Winter'
])
df4
3. 多层索引对象的索引与切片操作
1)Series的操作
【重要】对于Series来说,直接中括号[]与使用.loc[]完全一样,因此,推荐使用中括号索引和切片。
多层索引进行切片时,有些汉字,或者英文,不识别,运行异常,并不是代码的问题,自身的bug
(1) 索引
s
# 第一个参数,多层索引的第一维,第二个参数,多层索引第二维
s
[
'a'
,
'期中'
]
#['a','期中']作为一个参数
s
[[
'a'
,
'期中'
]]
s
[[
'a'
,
'b'
,
'c'
]]
s
.
loc
[
'李四'
,
'期末'
]
(2) 切片
s
[
'a'
:
'b'
]
s
.
iloc
[
0
:
3
]
s2
=
Series
(
data
=
np
.
random
.
randint
(
0
,
150
,
size
=
6
),
index
=
pd
.
MultiIndex
.
from_product
([
list
(
'ABC'
),[
'e'
,
'f'
]]))
s2
s2
[
'A'
:
'C'
]
s2
.
loc
[
'A'
:
'B'
]
2)DataFrame的操作
(1) 可以直接使用列名称来进行列索引
对于二维索引,如果包含中文,进行切片时,存在报错bug,不是代码问题
df1
.
index
=
pd
.
MultiIndex
.
from_product
([
list
(
'ABC'
),[
'期中'
,
'期末'
]])
df1
df1
[
'A'
:
'B'
]
df1
.
iloc
[
0
:
4
]
(2) 使用行索引需要用loc()等函数
【极其重要】推荐使用loc()函数
注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
df2
df2
.
loc
[
'张三'
,
'期中'
]
df2
.
loc
[
'张三'
]
.
loc
[
'期中'
]
df2
.
loc
[[
'张三'
,
'李四'
]]
============================================
练习9:
-
分析比较Series和DataFrame各种索引的方式,熟练掌握.loc()方法
-
假设张三再一次在期中考试的时候因为特殊原因放弃英语考试,如何实现?
============================================
4. 索引的堆(stack)
-
stack()
-
unstack()
【小技巧】使用stack()的时候,level等于哪一个,哪一个就消失,出现在行里。
df4
#stack = 堆--->行
#多层索引的列而言0,1,1:从上往下计数
df4
.
stack
()
df4
.
stack
(
level
=
0
)
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里。
df2
df2
.
unstack
(
level
=
1
)
============================================
练习10:
-
使用unstack()将ddd变为两行,分别为期中期末
-
使用unstack()将ddd变为四行,分别为四个科目
============================================
5. 聚合操作
【注意】
-
需要指定axis
-
【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就会进行计算。
所谓的聚合操作:平均数,方差,最大值,最小值……
df1
#axis=0 进行行间计算
#axis=1 进行列间计算
df1
.
sum
()
df1
.
sum
(
axis
=
1
)
df1
.
mean
(
axis
=
1
)
#数据离散的程度,方差越大数值间差距大
df1
.
std
(
axis
=
1
)
============================================
练习11:
-
计算各个科目期中期末平均成绩
-
计算各科目张三李四的最高分
============================================