Pandas层级索引
下面通过Serise创建,并在输入索引 index 时,输入了两个子list组成的list,第一个list时外层索引,第二个list时内层索引。
import numpy as np
import pandas as pd
s1 = pd.Series(np.random.randn(12),index=[['a','a','a','b','b','b','c','c','c','d','d','d'],[0,1,2,0,1,2,0,1,2,0,1,2]])
s1
a 0 1.624345
1 -0.611756
2 -0.528172
b 0 -1.072969
1 0.865408
2 -2.301539
c 0 1.744812
1 -0.761207
2 0.319039
d 0 -0.249370
1 1.462108
2 -2.060141
dtype: float64
# a b c d为外层索引 0 1 2 为内层索引
print(s1.index)
MultiIndex(levels=[['a', 'b', 'c', 'd'], [0, 1, 2]],
labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]])
# levels表示两个层级中分别有那些标签,labels是每个位置分别是什么标签。
- 选取子集:
# 内层选取需要[] 放置两个参数 第一个是外层索引,第二个是内层索引
# 取出每个层级里的第二个
# 逗号分割内外层
s1[:,2]
a -0.528172
b -2.301539
c 0.319039
d -2.060141
dtype: float64
# 取外层索引
s1['a']
0 1.624345
1 -0.611756
2 -0.528172
dtype: float64
- 层级索引的Series可以转换成DataFrame
# 层级索引的series可以转换成Dataframe
frame = pd.DataFrame(s1)
frame
0
a 0 1.624345
1 -0.611756
2 -0.528172
b 0 -1.072969
1 0.865408
2 -2.301539
c 0 1.744812
1 -0.761207
2 0.319039
d 0 -0.249370
1 1.462108
2 -2.060141
print(type(frame))
<class 'pandas.core.frame.DataFrame'>
- 层级索引通常用来数据重塑
# unstack 可以把层级索引的Series转换成DataFrame
s3 = s1.unstack()
s3
0 1 2
a 1.624345 -0.611756 -0.528172
b -1.072969 0.865408 -2.301539
c 1.744812 -0.761207 0.319039
d -0.249370 1.462108 -2.060141
print(type(s3))
<class 'pandas.core.frame.DataFrame'>
# 转换成dataframe就可以使用dataframe得方法进行值得选择
# 例如 标签选取
s3.loc[:,2]
a -0.528172
b -2.301539
c 0.319039
d -2.060141
Name: 2, dtype: float64
# 位置索引
s3.iloc[1,:]
0 -1.072969
1 0.865408
2 -2.301539
Name: b, dtype: float64
- 也可以把转换成得到DataFrame变回Series
# 变回层级索引的series
s4 = s3.stack()
a 0 1.624345
1 -0.611756
2 -0.528172
b 0 -1.072969
1 0.865408
2 -2.301539
c 0 1.744812
1 -0.761207
2 0.319039
d 0 -0.249370
1 1.462108
2 -2.060141
dtype: float64
print(type(s4))
<class 'pandas.core.series.Series'>
- 对于层级索引我们还可以交换内外层得索引
# 交换内外层的索引
s5 = s1.swaplevel()
s5
0 a 1.624345
1 a -0.611756
2 a -0.528172
0 b -1.072969
1 b 0.865408
2 b -2.301539
0 c 1.744812
1 c -0.761207
2 c 0.319039
0 d -0.249370
1 d 1.462108
2 d -2.060141
dtype: float64
- 交换内外层索引后进行排序
# 默认升序的排序
# 对内数据进行排序
s5.sortlevel()
0 a 1.624345
b -1.072969
c 1.744812
d -0.249370
1 a -0.611756
b 0.865408
c -0.761207
d 1.462108
2 a -0.528172
b -2.301539
c 0.319039
d -2.060141
dtype: float64
# 可以通过指定ascending=False 让索引进行降序排序
# 也可以指定值进行排序
s5.sort_values()
2 b -2.301539
d -2.060141
0 b -1.072969
1 c -0.761207
a -0.611756
2 a -0.528172
0 d -0.249370
2 c 0.319039
1 b 0.865408
d 1.462108
0 a 1.624345
c 1.744812
dtype: float64
注:以上实在jupyter notebook内运行 如果需要打印结果在python3中要嫁print(),python2中 要用print。
原文链接:https://blog.csdn.net/weixin_44984627/article/details/104765071