pandas基础--层次化索引
以下代码的前提:import pandas as pd
层次化索引使你能在一个轴上拥有多个(两个以上)索引级别。抽象的说,它使你能以低维度形式处理高维度数据。
>>> data = pd.Series(np.random.randn(10), index=[[‘a‘, ‘a‘, ‘a‘, ‘b‘, ‘b‘, ‘b‘, ‘c‘, ‘c‘, ‘d‘, ‘d‘], [1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
>>> data
a 1 3.230188
2 0.596511
3 0.956307
b 1 1.132221
2 0.746174
3 0.470007
c 1 0.880883
2 0.757047
d 2 -0.028331
3 0.382625
dtype: float64
>>> data.index #带MultiIndex索引的Series的格式化输出形式,索引之间的“间隔”表示“直接使用上面的标签”
MultiIndex([(‘a‘, 1),
(‘a‘, 2),
(‘a‘, 3),
(‘b‘, 1),
(‘b‘, 2),
(‘b‘, 3),
(‘c‘, 1),
(‘c‘, 2),
(‘d‘, 2),
(‘d‘, 3)],
)
>>> data[‘b‘] #选取数据子集
1 1.132221
2 0.746174
3 0.470007
dtype: float64
>>> data[‘b‘: ‘c‘]
b 1 1.132221
2 0.746174
3 0.470007
c 1 0.880883
2 0.757047
dtype: float64
>>> data.loc[[‘b‘, ‘d‘]]
b 1 1.132221
2 0.746174
3 0.470007
d 2 -0.028331
3 0.382625
dtype: float64
>>> data[:, 2] #在“内层”中进行选取
a 0.596511
b 0.746174
c 0.757047
d -0.028331
dtype: float64层次索引在数据重塑和基于和基于分组的操作(如透视表生成)中有重要作用。如可以通过unstack方法重新安排多层数据到一个DataFrame中。
>>> data
a 1 3.230188
2 0.596511
3 0.956307
b 1 1.132221
2 0.746174
3 0.470007
c 1 0.880883
2 0.757047
d 2 -0.028331
3 0.382625
dtype: float64
>>> data.unstack()
1 2 3
a 3.230188 0.596511 0.956307
b 1.132221 0.746174 0.470007
c 0.880883 0.757047 NaN
d NaN -0.028331 0.382625
>>> data.unstack().stack() #stack使unstack的逆运算
a 1 3.230188
2 0.596511
3 0.956307
b 1 1.132221
2 0.746174
3 0.470007
c 1 0.880883
2 0.757047
d 2 -0.028331
3 0.382625
dtype: float64对于一个DataFrame,每条轴都可以分成索引,每层都可以由名字(可能是字符串,也可以是别的python对象)。如果指定了名字,它们就会显示在控制台输出中。
>>> frame = pd.DataFrame(np.arange(12).reshape((4, 3)), index=[[‘a‘, ‘a‘, ‘b‘, ‘b‘], [1, 2, 1,
-2]], columns=[[‘Oh‘, ‘Oh‘, ‘Co‘], [‘Gr‘, ‘Re‘, ‘Gr‘]])
>>> frame
Oh Co
Gr Re Gr
a 1 0 1 2
2 3 4 5
b 1 6 7 8
-2 9 10 11
>>> frame.index.names = [‘key1‘, ‘key2‘]
>>> frame.columns.names = [‘state‘, ‘color‘]
>>> frame
state Oh Co
color Gr Re Gr
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
-2 9 10 11
>>> frame[‘Oh‘]
color Gr Re
key1 key2
a 1 0 1
2 3 4
b 1 6 7
-2 9 101.1 重排分级排序
有时需要调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(当数据不会发生变化)。
>>> frame
state Oh Co
color Gr Re Gr
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
-2 9 10 11
>>> frame.swaplevel(‘key1‘, ‘key2‘)
state Oh Co
color Gr Re Gr
key2 key1
1 a 0 1 2
2 a 3 4 5
1 b 6 7 8
-2 b 9 10 111.2 根据级别汇总统计
许多对DataFrame和Series的描述和汇总统计都有一个level选项,用于指定在某条轴上求和的级别。
>>> frame
state Oh Co
color Gr Re Gr
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
-2 9 10 11
>>> frame.sum(level=‘key2‘)
state Oh Co
color Gr Re Gr
key2
1 6 8 10
2 3 4 5
-2 9 10 11
>>> frame.sum(level=‘color‘, axis=1)
color Gr Re
key1 key2
a 1 2 1
2 8 4
b 1 14 7
-2 20 10
>>>1.3 使用DataFrame的列
经常将DataFrame的一个或多个列当作行索引来使用,或者希望将行索引变成DataFrame的列。
DataFrame的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame。
>>> frame = pd.DataFrame({‘a‘: range(7), ‘b‘: range(7, 0, -1), ‘c‘: [‘one‘, ‘one‘, ‘one‘, ‘two‘, ‘two‘, ‘two‘, ‘two‘], ‘d‘: [0, 1, 2, 0, 1, 2, 3]})
>>> frame
a b c d
0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
3 3 4 two 0
4 4 3 two 1
5 5 2 two 2
6 6 1 two 3
>>> frame2 = frame.set_index([‘c‘, ‘d‘])
>>> frame2
a b
c d
one 0 0 7
1 1 6
2 2 5
two 0 3 4
1 4 3
2 5 2
3 6 1
>>> frame.set_index([‘c‘, ‘d‘], drop=False) #可选择保留那些列
a b c d
c d
one 0 0 7 one 0
1 1 6 one 1
2 2 5 one 2
two 0 3 4 two 0
1 4 3 two 1
2 5 2 two 2
3 6 1 two 3reset_index的功能和set_index刚好相反、层次化索引的级别会被转移到列里面:
>>> frame2
a b
c d
one 0 0 7
1 1 6
2 2 5
two 0 3 4
1 4 3
2 5 2
3 6 1
>>> frame2.reset_index()
c d a b
0 one 0 0 7
1 one 1 1 6
2 one 2 2 5
3 two 0 3 4
4 two 1 4 3
5 two 2 5 2
6 two 3 6 1 相关推荐
jzlixiao 2020-08-18
QianYanDai 2020-07-04
ribavnu 2020-11-16
moyekongling 2020-11-13
chenjiazhu 2020-09-29
kikaylee 2020-10-31
liuweiq 2020-09-09
silencehgt 2020-09-07
sunnyxuebuhui 2020-09-07
西瓜皮儿的皮儿 2020-09-07
明瞳 2020-08-19
MissFuTT 2020-08-18
zhushenghan 2020-08-16
罗罗 2020-08-16
mrandy 2020-08-15