Pandas 索引转置函数stack(),unstack()详解

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()操作,分别将高维列索引'周期'转为了低维行索引,然后又将高维行索引'销售'转为了低维列索引

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值