学习pandas的时候一直搞不清stack()和unstack(),看起来就是把df转了转但一直不知道具体原理。
看了【Python】pandas轴旋转stack和unstack用法详解后,觉得清楚了很多,再结合《利用python进行数据分析》的解释和例子,写下这篇博客作一个总结和思考。
stack()即“堆叠”,作用是将列旋转到行
unstack()即stack()的反操作,将行旋转到列
看个栗子:
# 创建一个df
data = pd.DataFrame(np.arange(6).reshape((2, 3)),
index=pd.Index(['Ohio', 'Colorado'], name='state'),
columns=pd.Index(['one', 'two', 'three'],
name='number'))
长这样:
number one two three
state
Ohio 0 1 2
Colorado 3 4 5
做一个列转行的旋转:
result = data.stack()
result
state number
Ohio one 0
two 1
three 2
Colorado one 3
two 4
three 5
dtype: int32
原来的列数据one, two, three就到了行上来了,形成多层索引。
注意这里:stack()操作后返回的对象是Series类型
转回来:
result.unstack()
number one two three
state
Ohio 0 1 2
Colorado 3 4 5
这里,在多层序列中,比如刚stack()过后的result,可以用unstack()将数据重新排列后放入一个df里。
比如,还是result:
state number
Ohio one 0
two 1
three 2
Colorado one 3
two 4
three 5
dtype: int32
行索引是有两级的,里层的number和外层的state。
由于stack和unstack默认是操作最里层的数据,当我们想操作外层的数据时,就要传入一个层级序号或名称来拆分一个不同的层级。
result.unstack(0)
输出是:
state Ohio Colorado
number
one 0 3
two 1 4
three 2 5
换个参数:
result.unstack(1)
number one two three
state
Ohio 0 1 2
Colorado 3 4 5
对比两个结果,当层级序号为0时,unstack()将state行旋转到了列
当输入参数为1时,将number行旋转到了列。
如果分不清层级序号的话,参数输入层级名称也是可以的,即
result.unstack(0) = result.unstack('state')
result.unstack(1) = result.unstack('number')