Pandas之stack()和unstack()用法
学习pandas的时候一直搞不清stack()和unstack(),看起来就是把df转了转但一直不知道具体原理。 看了后,觉得清楚了很多,再结合《利用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)