创建展示效果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():
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
df1.stack()
二、表结构索引转换
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()
melt()函数基本格式:
pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_
参数说明:
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')