Python学习笔记:pandas数据堆叠之stack、unstack与reshape
在分类汇总数据中,stack()
和 unstack()
是进行层次化索引的重要操作。
层次化索引就是对索引进行层次化分类,包含行索引、列索引。
常见的数据层次化结构包含两种:表格(横表)、“花括号”(纵表)。
表格在行列方向上均有索引,花括号结构只有“列方向”上的索引。
其实,应用 stack()
和 unstack()
只需要记住:
stack
—— 将数据从”表格结构“变成”花括号结构“,即将其列索引变成行索引。unstack
—— 数据从”花括号结构“变成”表格结构“,即要将其中一层的行索引变成列索引。如果是多层索引,则以上函数是针对内层索引,利用level
参数可以选择具体哪层索引。
【小技巧】使用 stack()
的时候,level
等于哪一个,哪一个就消失,出现在行里。
【小技巧】使用 unstack()
的时候,level
等于哪一个,哪一个就消失,出现在列里。
一、stack堆叠
stack()
返回一个 Series
, 需要通过 reset_index()
进行重置索引。
使用语法:
DataFrame.stack(level=-1, dropna=True)
- 单索引
# 构建测试集
import pandas as pd
import numpy as np
df_size = 10
df = pd.DataFrame({
'a': np.random.rand(df_size),
'b': np.random.rand(df_size),
'c': np.random.rand(df_size),
'd': np.random.rand(df_size),
'e': np.random.rand(df_size)
})
print(df)
# 不指定参数 所有列都将被堆叠
data = df.stack() # 一维Series
'''
0 a 0.374002
b 0.289687
c 0.720090
d 0.645252
e 0.063648
1 a 0.012059
b 0.228809
c 0.018861
d 0.511085
e 0.002751
dtype: float64
'''
# 重设索引
df.stack().reset_index()
'''
level_0 level_1 0
0 0 a 0.374002
1 0 b 0.289687
2 0 c 0.720090
3 0 d 0.645252
4 0 e 0.063648
'''
使用 stack
函数,将数据框的列索引转变成行索引(第二层),得到一个层次化的 Series
。
- 多层索引
multicol1 = pd.MultiIndex.from_tuples([('weight', 'kg'),
('weight', 'pounds')])
df_multi = pd.DataFrame([[1, 2], [2, 4]],
index=['cat', 'dog'],
columns=multicol1)
df_multi.stack() # 内层列索引
df_multi.stack(level=1) # 同上 内层列索引
df_multi.stack(level=0) # 第一层列索引
# 删除空数据行
df_multi.stack(dropna=True)
二、unstack反堆叠
使用语法:
DataFrame.unstack(level=-1, fill_value=None)
- 单索引
# 反堆叠
df.stack().unstack()
# 通过level参数选择堆叠的索引
df.stack().unstack(level=0)
'''
0 1 2 ... 7 8 9
a 0.521016 0.349603 0.140595 ... 0.578615 0.629479 0.896016
b 0.043503 0.540825 0.379667 ... 0.570826 0.484303 0.922657
c 0.674632 0.044395 0.931385 ... 0.974338 0.228876 0.081472
d 0.960165 0.859809 0.713214 ... 0.247970 0.665914 0.653477
e 0.330087 0.453380 0.293309 ... 0.885709 0.591437 0.842542
'''
# 列标签填充
df.stack().unstack(level=0, fill_value='type')
利用 unstack
函数,将生成后的第二层行索引转变成列索引(默认内层索引,level=-1),恢复原始数据框。
- 多层索引
df_multi2 = df_multi.stack(level=0)
df_multi2.unstack(level=0)
'''
kg pounds
cat dog cat dog
weight 1 2 2 4
'''
三、reshape变形
实现 Series
数据变形。
import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(12).reshape(3,4),
index=pd.Index(['street1','street2','street3']),
columns=pd.Index(['store1','store2','store3','store4']))
print(data)
参考链接:Python: Pandas中stack和unstack的形象理解
参考链接:pandas中stack的用法
分类:
Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)