stack()及unstack()函数简介
stack()具有堆栈的意思,在pandas中,stack的作用在于通过转置索引来实现堆栈效果,stack()的作用为将列索引转到行索引进行堆栈,将已存在的行索引变为高维行索引,列索引为低维行索引。
unstack()则相反,是将列索引转为行索引,列索引变为低维行索引,原行索引变为高维行索引
注意,如果经过stack()或unstack()进行索引转置后,如果出现了其中一轴为空的情况,则DataFrame就变为了Series,对于Series对象来说,它是一个列方向的一维容器,所以也只有列索引,所以Series对象只能使用unstack()函数,通过将列索引变为行索引可以变为DataFrame
stack()及unstack()函数具有参数level,level的值默认为-1,含义为索引的下标,具象化来说,如果DataFrame的一个轴或Series中存在高维索引,比如索引有两个维度,则高维索引的下标为0,低维索引的下标为1,反之,我们也可以用反向索引,低维索引的下标为-1,高维索引的下标为-2
例一:普通dataframe使用stack()
import numpy as np
import pandas as pd
np.random.seed(1)
col = pd.Index(data = list('ABCD'),name = '商品')
inde = pd.Index(data = ['tom','jerry','nancy'],name = '销售')
data = pd.DataFrame(data=np.random.randint(0,100,(3,4)),index = inde,columns=col)
print(data,end = '\n\n')
print(data.stack(),end = '\n\n')
# 商品 A B C D
# 销售
# tom 37 12 72 9
# jerry 75 5 79 64
# nancy 16 1 76 71
#
# 销售 商品
# tom A 37
# B 12
# C 72
# D 9
# jerry A 75
# B 5
# C 79
# D 64
# nancy A 16
# B 1
# C 76
# D 71
# dtype: int32
例二:Series使用unstack()
这里我们通过stack函数将列索引转化为低维行索引,使data变为了一个Series对象,并且具有高维索引,这里我们可以使用unstack将列索引转为行索引,我们有两种选择,一种选销售,一种选商品,执行的方式为参数level的调用level参数默认为为-1,也就是低维索引商品
import numpy as np
import pandas as pd
np.random.seed(1)
col = pd.Index(data = list('ABCD'),name = '商品')
inde = pd.Index(data = ['tom','jerry','nancy'],name = '销售')
data = pd.DataFrame(data=np.random.randint(0,100,(3,4)),index = inde,columns=col)
print(data,end = '\n\n')
data=data.stack()
print(data,end = '\n\n')
print(data.unstack())
#商品 A B C D
#销售
#tom 37 12 72 9
#jerry 75 5 79 64
#nancy 16 1 76 71
# 销售 商品
# tom A 37
# B 12
# C 72
# D 9
# jerry A 75
# B 5
# C 79
# D 64
# nancy A 16
# B 1
# C 76
# D 71
# dtype: int32
#
# 商品 A B C D
# 销售
# tom 37 12 72 9
# jerry 75 5 79 64
# nancy 16 1 76 71
这里若想要将销售变为行索引,只需要将level设置为0或者-2即可
import numpy as np
import pandas as pd
np.random.seed(1)
col = pd.Index(data = list('ABCD'),name = '商品')
inde = pd.Index(data = ['tom','jerry','nancy'],name = '销售')
data = pd.DataFrame(data=np.random.randint(0,100,(3,4)),index = inde,columns=col)
print(data,end = '\n\n')
data=data.stack()
print(data,end = '\n\n')
print(data.unstack(level=-2))
# 商品 A B C D
# 销售
# tom 37 12 72 9
# jerry 75 5 79 64
# nancy 16 1 76 71
#
# 销售 商品
# tom A 37
# B 12
# C 72
# D 9
# jerry A 75
# B 5
# C 79
# D 64
# nancy A 16
# B 1
# C 76
# D 71
# dtype: int32
#
# 销售 tom jerry nancy
# 商品
# A 37 75 16
# B 12 5 1
# C 72 79 76
# D 9 64 71
例三:具有高维索引的DataFrame使用stack()和unstack()
import numpy as np
import pandas as pd
np.random.seed(1)
multic = pd.MultiIndex.from_product([['星期一','星期二'],list('ABCD')],names = ['周期','商品'])
inde = pd.Index(data = ['tom','jerry','nancy'],name = '销售')
data = pd.DataFrame(data = np.random.randint(0,100,(3,8)),index=inde,columns=multic)
print(data,end='\n\n')
data = data.stack(level=0)
print(data,end='\n\n')
print(data.unstack(level = -2))
# 周期 星期一 星期二
# 商品 A B C D A B C D
# 销售
# tom 37 12 72 9 75 5 79 64
# jerry 16 1 76 71 6 25 50 20
# nancy 18 84 11 28 29 14 50 68
#
# 商品 A B C D
# 销售 周期
# tom 星期一 37 12 72 9
# 星期二 75 5 79 64
# jerry 星期一 16 1 76 71
# 星期二 6 25 50 20
# nancy 星期一 18 84 11 28
# 星期二 29 14 50 68
#
# 商品 A B C D
# 销售 jerry nancy tom jerry nancy tom jerry nancy tom jerry nancy tom
# 周期
# 星期一 16 18 37 1 84 12 76 11 72 71 28 9
# 星期二 6 29 75 25 14 5 50 50 79 20 68 64
在这个例子中,我们先后将行索引具有高维索引的DataFrame进行了stack()和unstack()操作,分别将高维列索引'周期'转为了低维行索引,然后又将高维行索引'销售'转为了低维列索引