Pandas之层级索引

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。

发布了21 篇原创文章 · 获赞 12 · 访问量 446

猜你喜欢

转载自blog.csdn.net/weixin_44984627/article/details/104765071
今日推荐