一文速学-Pandas索引重塑实现长宽表数据转换
前言
Pandas的基础数据结构Series和DataFrame。若是还不清楚的可以再去看看我之前的博客详细介绍这两种数据结构的处理方法: 一文速学-数据分析之Pandas数据结构和基本操作代码
一文速学-Pandas实现数值替换、排序、排名、插入和区间切片 一些Pandas基础函数的使用方法: DataFrame行列表查询操作详解+代码实战
DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示
Pandas中read_excel函数参数使用详解+实例代码
关于包含在异常值里面的空值和重复值均有三篇博客专门详细介绍了处理他们的方法: 一文速学-Pandas处理重复值操作各类方法详解+代码展示
一文速学-Pandas异常值检测及处理操作各类方法详解+代码展示
创建展示效果DataFrame
data = {
'sum':[100, 120, 130, 150, 160],
'2020':[30,30,40,50,40],
'2021':[30,50,50,20,40],
'2022':[40,40,40,80,80]
}
name=['user1', 'user2', 'user3', 'user4', 'user5']
df1= pd.DataFrame(data,names='name',index=name)
一、索引重塑
索引重塑就是将原来的索引进行重新构造,我们根据DataFrame的结构表可知,我们锁定一个数据是依靠他的列名和行名对应得到,可以理解为该数据的x和y坐标轴。例如我们想查找user2的2021年数据。而重塑索引更像是换了个坐标系,等于换了个基。
这种通过两个特征确定唯一值的方法,我们不仅可以用表格型结构表示,还可以用树形结构来表示:
树形结构其实就是在维持表格型行索引不变的情况下,把列索引该为二次行索引,相当于把表格型数据建立成层次化索引。
在pandas用到的方法是stack():
df1.stack()
user1 sum 100
2020 30
2021 30
2022 40
user2 sum 120
2020 30
2021 50
2022 40
user3 sum 130
2020 40
2021 50
2022 40
user4 sum 150
2020 50
2021 20
2022 80
user5 sum 160
2020 40
2021 40
2022 80
dtype: int64
二、表结构索引转换
1.宽表转化为长表
(1).stack
DataFrame.stack官网,基本格式:
DataFrame.stack(level=-1, dropna=True)
根据pandas提供的stack()方法很容易就能实现长宽表之间的转换,以下就为一个宽表:
要将宽表转化为长表首先要保持name和city不变的前提下,将年份信息变为行索引,所以要现将name和city先设置为索引,然后再调用stack()方法,将列索引也转换为行索引,最后用reset_index()方法进行索引重置。(若还是对索引方法不清楚的可以再去看看一文速学-Pandas索引设置操作各类方法详解+代码展示这篇博客)
df1.set_index(['name','city'],inplace=True)
df1=df1.stack().reset_index()
(2).melt
melt()函数基本格式:
pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)
参数说明:
- frame:指定DataFrame
- id_vars:{tuple, list, or ndarray, optional},将指定的列作为标识符变量,也就是用于指明宽表转换到长表时保持不变的列
- value_vars:指定第二索引列,如果不指定,将默认设置为id_vars使用的所有列
- var_name:表示原来的列索引转化为行索引以后对应的列名
- value_name:表示新索引对应的值的列名
df1.melt(id_vars=['name','city'],var_name='year',value_name='sale')
使用这段代码可以达到和stack一样的效果:
2.长表转换为宽表
常用方法为数据透视表,在pnadas可以使用pivot函数:
DataFrame.pivot(index=None, columns=None, values=None)
参数说明:
- index:指定为行索引
- columns:指定为列索引
- value:指定为值
df1.pivot(index=['name','city'],columns='year',values='sale')
点关注,防走丢,如有纰漏之处,请留言指教,非常感谢
以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见。
转载自:https://juejin.cn/post/7126065405352738823