1 分层索引
很多应用中,数据可能分布在多个文件或数据库中,抑或是某种不易于分析的格式进行排列,对这些进行数据联合,链接以及重拍列。
分层索引是pandas的重要特性,允许你在一个轴向上拥有多个索引层级。
data = pd.Series(np.random.randn(9),
index=[['a', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd'],
[1, 2, 3, 1, 3, 1, 2, 2, 3]])
data
a 1 1.246435
2 1.007189
3 -1.296221
b 1 0.274992 # 这是一个以MultiIndex 作为索引的series 美化图。
3 0.228913
c 1 1.352917
2 0.886429
d 2 -2.001637
3 -0.371843
dtype: float64
MultiIndex([('a', 1),
('a', 2), # 额,,为啥和书上的不一样啊///
('a', 3),
('b', 1),
('b', 3),
('c', 1),
('c', 2),
('d', 2),
('d', 3)],
)
data['b':'c']
data.loc[['b','d']] # 各种分层索引,,部分索引。
data.loc[:,2]
a 1.007189
c 0.886429 # b 没有索引 2 所以就跳过了
d -2.001637
dtype: float64
data.unstack() # 使用这个方法将数据在 dataframe 中重新排列,就是把123 那层索引去了
1 2 3
a -1.647827 2.397676 0.188066 # 额,这随机的数据不是原来那个了。。让我给重搞了。。
b 0.860510 NaN 1.747142
c 0.321955 1.026804 NaN
d NaN -1.083873 -0.487780
data.unstack().stack() # stack 是反操作
a 1 -1.647827
2 2.397676
3 0.188066
b 1 0.860510
3 1.747142
c 1 0.321955
2 1.026804
d 2 -1.083873
3 -0.487780
dtype: float64
frame = pd.DataFrame(np.arange(12).reshape((4, 3)),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=[['Ohio', 'Ohio', 'Colorado'],
['Green', 'Red', 'Green']])
frame
Ohio Colorado
Green Red Green # dataframe 中,每个轴都可以拥有分层索引:
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
frame.index.names=['key1','key2'] # 分层的层级可以有名称(字符串或python对象)
frame.columns.names=['state','color']
frame
state Ohio Colorado # 额,,还是控制台输出的更好看。。
color Green Red Green
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
frame['Ohio'] # 通过部分列索引,可以选出列中的组。
color Green Red
key1 key2
a 1 0 1
2 3 4
b 1 6 7
2 9 10
# 一个 MultIndex 对象可以使用自身的构造函数创建并服用。
index = pd.MultiIndex.from_arrays([['Ohio', 'Ohio', 'Colorado'], ['Green', 'Red', 'Green']], names=['state', 'color'])
MultiIndex([( 'Ohio', 'Green'),
( 'Ohio', 'Red'),
('Colorado', 'Green')],
names=['state', 'color'])
pd.DataFrame(np.arange(9).reshape(3,3),index=index) # 根据创建的 MultIndex 对象来创建一个dataframe。
0 1 2
state color
Ohio Green 0 1 2
Red 3 4 5
Colorado Green 6 7 8
1.1 重排序和层级排序
有时,你需要重新排列轴上的层级顺序,或者按照特定层级的值对数据进行排序。 swaplevel 接收两个层级序号或层级名称,返回一个进行了层级变更的新对象(但是数据是不变的).
frame
state Ohio Colorado
color Green Red Green
key1key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
frame.swaplevel('key1','key2')
state Ohio Colorado
color Green Red Green
key2key1
1 a 0 1 2
2 a 3 4 5
1 b 6 7 8
2 b 9 10 11
# 另一方面,sort_index 只能在单一层级上对数据进行排序,在进行层级变换时,使用这个是结果按照层级进行字典排序
frame.sort_index(level=1)
state Ohio Colorado
color Green Red Green
key1 key2
a 1 0 1 2
b 1 6 7 8
a 2 3 4 5
b 2 9 10 11
frame.swaplevel(0,1).sort_index(level=0) # 最后这个就是.sort_index()
state Ohio Colorado
color Green Red Green
key2 key1
1 a 0 1 2
b 6 7 8
2 a 3 4 5
b 9 10 11
1.2 按层级进行汇总统计
dataframe and series 中有很多描述性和汇总哦统计有一个 level 选项,通过level 选项可以指定你想要在某个特定的轴上进行聚合。
frame
state Ohio Colorado
color Green Red Green
key1 key2
a 1 0 1 2
2 3 4 5
b 1 6 7 8
2 9 10 11
frame.sum(level='key2') # 就是 1 2 索引对应的数值相加。。
state Ohio Colorado
color Green Red Green
key2
1 6 8 10
2 12 14 16
frame.sum(level='color',axis=1)
color Green Red
key1 key2
a 1 2 1
2 8 4 # 两个 Green 合并了
b 1 14 7
2 20 10
1.3 使用 Dataframe 的列进行索引
通常我们不会使用dataframe 中一个或多个列作为索引,反而你可能想要将行索引移动到 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']) # set_index 函数生成使用一个或多个列作为索引的 dataframe
frame2
a b
c d
one 0 0 7
1 1 6 # 这将 c d 作为了列索引啊,,
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 3
frame2.reset_index() # 这个是反操作,将分层索引的索引层搞到列中
额又整出了些幺蛾子。。。。。这些收益是什么呢,会不会有人试试呢。。。。