likes
comments
collection
share

一文速学-Pandas索引重塑实现长宽表数据转换

作者站长头像
站长
· 阅读数 14

前言

Pandas的基础数据结构Series和DataFrame。若是还不清楚的可以再去看看我之前的博客详细介绍这两种数据结构的处理方法: 一文速学-数据分析之Pandas数据结构和基本操作代码

一文速学-Pandas实现数值替换、排序、排名、插入和区间切片 一些Pandas基础函数的使用方法: DataFrame行列表查询操作详解+代码实战

DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示

Pandas中read_excel函数参数使用详解+实例代码

一文速学-Pandas索引设置操作各类方法详解+代码展示

关于包含在异常值里面的空值和重复值均有三篇博客专门详细介绍了处理他们的方法: 一文速学-Pandas处理重复值操作各类方法详解+代码展示

一文速学-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)

一文速学-Pandas索引重塑实现长宽表数据转换

一、索引重塑

索引重塑就是将原来的索引进行重新构造,我们根据DataFrame的结构表可知,我们锁定一个数据是依靠他的列名和行名对应得到,可以理解为该数据的x和y坐标轴。例如我们想查找user2的2021年数据。而重塑索引更像是换了个坐标系,等于换了个基。

这种通过两个特征确定唯一值的方法,我们不仅可以用表格型结构表示,还可以用树形结构来表示:

一文速学-Pandas索引重塑实现长宽表数据转换 树形结构其实就是在维持表格型行索引不变的情况下,把列索引该为二次行索引,相当于把表格型数据建立成层次化索引。

在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()方法很容易就能实现长宽表之间的转换,以下就为一个宽表:

一文速学-Pandas索引重塑实现长宽表数据转换

要将宽表转化为长表首先要保持name和city不变的前提下,将年份信息变为行索引,所以要现将name和city先设置为索引,然后再调用stack()方法,将列索引也转换为行索引,最后用reset_index()方法进行索引重置。(若还是对索引方法不清楚的可以再去看看一文速学-Pandas索引设置操作各类方法详解+代码展示这篇博客)

df1.set_index(['name','city'],inplace=True)

一文速学-Pandas索引重塑实现长宽表数据转换

df1=df1.stack().reset_index()

一文速学-Pandas索引重塑实现长宽表数据转换

(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一样的效果:

一文速学-Pandas索引重塑实现长宽表数据转换

2.长表转换为宽表

常用方法为数据透视表,在pnadas可以使用pivot函数:

DataFrame.pivot(index=None, columns=None, values=None)

参数说明:

  • index:指定为行索引
  • columns:指定为列索引
  • value:指定为值
df1.pivot(index=['name','city'],columns='year',values='sale')

一文速学-Pandas索引重塑实现长宽表数据转换

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见。