苦于在网上找不到对与unstack与stack的很直观对于我们这些小白很友好的解释,在自行研究一番后,决定自己写一个,用词不会很专业,只希望以最简单最直白的方式来解释。
首先将我两个基友当做祭品献上,创建一个数据组:
import pandas as pd
data1={'姓名':['陈冠文','陈冠文','陈冠文','刘力','刘力','刘力','陈俞','陈俞','陈俞'],
'属性':['颜值','幽默','运动','颜值','幽默','运动','颜值','幽默','运动'],
'得分':[100,100,100,80,80,70,50,50,30]}
df=DataFrame(data1)
df = df.set_index(['姓名','属性'])
df
将姓名和属性设置为索引,如下图:
对于unstack和stack的官方解释,可以自行查阅。
我只说下我自己的理解:
stack简单说就是把columns转成index
unstack就是把index转成columns
再甚至,可以理解为:
stack是一个‘逆时针’的旋转
unstack是一个‘顺时针’旋转
关于这个顺逆时针我在下面会说到。
首先先来一个unstack的变化:
在不设置level的情况下,转化过程就是我箭头方向的移动过程:
df.unstack()
默认是最里层的(属性),转到columns的最里层,也就是得分的‘下面’,
它把index转变成了一个columns,所以看成是一个‘顺时针’的旋转。
同理df.unstack().stack():
将columns转化为了index,可看成‘逆时针’的旋转。
明白了这个最基本的原理后,接下来进行一些变化:
进行两次unstack:
第一次:df.unstack()
第二次:df.unstack().unstack()
出现了不一样的变化:
它转变为了一个一维数据组(由于是中文,有点不太对齐,大致能看出,得分一栏,属相往下一栏,姓名往下一栏)
你可以粗暴的理解为:pandas把它‘放平了’!
得分,属性,姓名就是index,columns没有了,这会有助于你理解接下来的‘翻转’!
此时看这张图:由于‘只有index,没有columns’,如果再进行stack逆时针旋转,columns就没有东西给你翻转了。
报错了!
此时,只能进行unstack翻转:
df.unstack().unstack().unstack()
原理还是一样,默认最里层姓名一栏顺时针旋转到了columns一栏
再来一次:df.unstack().unstack().unstack().unstack()
最里面的属性转到了columns的最里面,姓名一栏被顶到‘外面’去了
理解完旋转过程后,接下来就是用level指定要旋转的列或行。
依次类推0,1,2,3...
下面开始变形:
df.unstack(level=0)
此时不是默认的最里面的属性一栏的旋转,而是我们指定的level=0的姓名一栏的顺时针旋转,旋转的位置依旧是columns的最里层
注:旋转的对象可以指定,但是旋转后的位置只能是最里层
同理:df.unstack(level=0).stack(level=0)
理解完这些变化后,再复杂的多重索引列表都可以轻松‘翻转’到你想到的格式啦。