文章数据
收藏(次)
【python数据分析】第八章 数据规整
层次化索引
--------------------------------------------------------------------------------
import numpy as np
import pandas as pd
ser = 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]
])
ser 输出:
a 1 0.174009
2 0.412163
3 0.105054
b 1 -0.104051
3 -0.129592
c 1 -1.757513
2 -0.189084
d 2 0.031062
3 0.940769
dtype: float64
ser.index # 输出的是复合索引
ser.loc['a']
ser['a']
ser['b':'c'] # 切片, 前闭后闭区间
ser['b',1] # 先用b 索引,然后取b中索引是1的
ser[1] # 不是对二层索引的使用,而是位置,所以这个是使用位置索引,取得全数据的第2条
ser[['a', 'c']] # 取出指定的索引 a c的所在数据
ser.loc[:, 1:2] # 取出二级索引[1,2] 的数据,前闭后闭,
# 一会后闭,一会后开,好乱。应该是只要是位置就是后开,非位置的是后闭
# 这里 1:2 切片不是位置,而是指定的索引,所以后闭
# 经过测试,索引如果是数字的,那么 s[1:3] 是位置索引,
# 如果想通过索引进行索引那就 s.loc[1:3]
# ser22 = pd.Series(range(5), index=range(5))
# ser22[1:3] 位置索引,前闭后开,得到2个值
# ser22.loc[1:3] 非位置索引,前闭后闭,得到3个值
ser.loc[:, 1] # 二级索引是 1 的数据
ser.unstack() # 有二级索引,可以变成 dataFrame 类型啊, 空的补 NA
输出:
1 2 3
a 0.174009 0.412163 0.105054
b -0.104051 NaN -0.129592
c -1.757513 -0.189084 NaN
d NaN 0.031062 0.940769
那么DataFrame 也能变成带有二级索引的 Series
frame = pd.DataFrame(np.arange(12).reshape(3,4), index=['r1', 'r2', 'r3'], columns=['c1', 'c2', 'c3', 'c4'])
frame.stack()
输出:
r1 c1 0
c2 1
c3 2
c4 3
r2 c1 4
c2 5
c3 6
c4 7
r3 c1 8
c2 9
c3 10
c4 11
dtype: int32
--------------------------------------------------------------------------------
frame = pd.DataFrame(np.arange(16).reshape(4,4),
index=[
['s1','s1', 's2', 's2'],
['s1r1', 's1r2', 's2r1', 's2r2']
],
columns=[['c1', 'c1', 'c2', 'c2'], ['c11', 'c12', 'c21', 'c22']] )
输出:
c1 c2
c11 c12 c21 c22
s1 s1r1 0 1 2 3
s1r2 4 5 6 7
s2 s2r1 8 9 10 11
s2r2 12 13 14 15
--------------------------------------------------------------------------------
使用 MultiIndex 创建外界可以公用的索引
multidx = pd.MultiIndex.from_arrays(
[['Ohio', 'Ohio', 'Colorado'], ['Green','Red', 'Green']],
names=['state', 'color']) # names 参数好像没什么用啊
pd.DataFrame(np.arange(12).reshape(3,4), index=multidx) # 创建时直接赋值
================================================================================
重排与分级排序
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
frame = pd.DataFrame(np.arange(16).reshape(4,4),
index=[
['s1','s1', 's2', 's2'],
['s1r1', 's1r2', 's2r1', 's2r2']
], columns=[['c1', 'c1', 'c2', 'c2'], ['c11', 'c12', 'c21', 'c22']])
frame.swaplevel() # 行上的索引,一级变成2级,二级的变一级
frame.swaplevel(axis=1) # 列上的索引
frame.swaplevel() 的输出:
c1 c2
c11 c12 c21 c22
s1r1 s1 0 1 2 3
s1r2 s1 4 5 6 7
s2r1 s2 8 9 10 11
s2r2 s2 12 13 14 15
--------------------------------------------------------------------------------
排序:
frame.sort_index(level=0, ascending=False, axis=1)
level 的取值 0,1, 0:一级索引排序 1:二级索引排序
frame.sum(): 忽略 行上的 级别,某列的全部行求和
输出:
c1 c11 24
c12 28
c2 c21 32
c22 36
dtype: int64
frame.sum(level=0) # 不是全部的行,而是一级索引内的所有行
输出:
c1 c2
c11 c12 c21 c22
s1 4 6 8 10
s2 20 22 24 26
frame.sum(level=1) # 二级内的所有行,就像每个二级的行都是一组,组内求和
--------------------------------------------------------------------------------
frame.set_index() 函数的作用:frame数据加载完毕,索引有或者没有,现在想用frame
中的某一列(可以多列)作为索引,此时这一列不再是数据列,而变成了索引列。
如果set_index() 指定的是两列,那就变成有层次的复合索引了。
--------------------------------------------------------------------------------
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]
})
frame2 = frame.set_index(['c']) # 只是 c 列作为索引,c列不再是数据列
输出:
a b d
c
one 0 7 0
one 1 6 1
one 2 5 2
two 3 4 0
two 4 3 1
two 5 2 2
two 6 1 3
frame2 = frame.set_index(['c','d']) # c d 都作为索引,此时c变成1级索引,d变成二级了
输出: c,d 不是数据列了,变成了索引列,
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
如果还想保留c,d的值作为数据列,他们变成索引,也不要影响数据
frame2 = 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() # 反向操作,注意,列不要重复,会报错的
frame2.reset_index(drop=False)
================================================================================
分享
收藏
点赞人
举报
文章标签
评论列表