pandas的层次化索引
层次化索引是pandas的一项比较重要的功能,它能够让你在一个轴上拥有多个索引级别,另一种说法是它能以低纬度形式处理高纬度数据
series层次化索引
# Series的层次化索引,索引是一个二维数组,相当于两个索引决定一个值
data = Series(np.arange(1,10),index = [["a","a","a","b","b","c","c","d","d"],[1,2,4,1,2,5,1,2,6]])
print(data)
out:
a 1 1
2 2
4 3
b 1 4
2 5
c 5 6
1 7
d 2 8
6 9
dtype: int32
#显示层次化索引
print(data.index)
out:
MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 4, 5, 6]],
labels=[[0, 0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 3, 0, 1, 4]])
#选取第一个索引为a的数据
data['a']
out:
1 1
2 2
4 3
dtype: int32
data['c':'d']
out:
c 5 6
1 7
d 2 8
6 9
dtype: int32
#通过unstack方法可以将Series变成一个DataFrame
#数据的类型以及数据的输出结构都变成了DataFrame,对于不存在的位置使用NaN填充
data.unstack()
out:
1 2 4 5 6
a 1.0 2.0 3.0 NaN NaN
b 4.0 5.0 NaN NaN NaN
c 7.0 NaN NaN 6.0 NaN
d NaN 8.0 NaN NaN 9.0
#通过stack方法,可以将DataFrame变成Series,它是unstack的逆运算
data.unstack().stack()
out:
a 1 1.0
2 2.0
4 3.0
b 1 4.0
2 5.0
c 1 7.0
5 6.0
d 2 8.0
6 9.0
dtype: float64
DataFrame的层次化索引
对于DataFrame来说,行和列都能够进行层次化索引。
#DataFrame的行和列都是用层次化索引
#也就是四个索引来决定一个值,将一个二维数据变成了一个四维数据
data = DataFrame(np.arange(12).reshape(4,3),index = [["a","a","b","b"],[1,2,1,2]],columns=[["A","A","B"],["Z","X","C"]])
print(data)
print(data['A']) #这样子只能获取列,不能获取行,若想选取行,则
#选取行
data.loc['a']
data.loc['a','A']
out:
A B
Z X C
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
Z X
a 1 0 1
2 3 4
b 1 6 7
2 9 10
Z X
1 0 1
2 3 4
#对于dataframe,每条轴都可以分层索引,各层都可以有自己的名字的
data.index.names =["row1","row2"]
print(data)
out:
A B
Z X C
row1 row2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
data.columns.names =["column1","column2"]
print(data)
out:
column1 A B
column2 Z X C
row1 row2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
###根据级别汇总统计
print(data)
out:
column1 A B
column2 Z X C
row1 row2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
#求和运算 根据行级别进行求和
data.sum(level='row1')
out:
column1 A B
column2 Z X C
row1
a 3 5 7
b 15 17 19
data.sum(level='row2')
out:
column1 A B
column2 Z X C
row2
1 6 8 10
2 12 14 16
#根据列级别进行求和
data.sum(level='column1',axis=1)
out:
column1 A B
row1 row2
a 1 1 2
2 7 5
b 1 13 8
2 19 11
data.sum(level='column2',axis=1)
out:
column2 C X Z
row1 row2
a 1 2 1 0
2 5 4 3
b 1 8 7 6
2 11 10 9
网友评论