学习记录647@python之pandas多重索引与列索引转行索引应用

需求

左表转化为右表的形式,左表是多重列索引,右表为多重行索引,这在时间序列数据中是非常 常见的。
在这里插入图片描述

代码

以下代码是在pycharm中的jupyter notebook中写的,然后在浏览器中打开,下载为md文档,再导入到csdn中,真是方便极了!!!

完整代码如下

import numpy as np
import pandas as pd
numbers = ['000001', '600000', '688001']
colors = [2016, 2017]
mindex=pd.MultiIndex.from_product([numbers, colors],names=['code', 'year'])
mindex
MultiIndex([('000001', 2016),
            ('000001', 2017),
            ('600000', 2016),
            ('600000', 2017),
            ('688001', 2016),
            ('688001', 2017)],
           names=['code', 'year'])
 #第1 2行为表头,自动转化为列的多重索引,第一列为行索引
df = pd.read_excel(io = r'test1.xlsx',header=[0,1],index_col=[0])
df.index.name='code'
df.head()
year20062007
quarter12341234
code
000001.SZ100000100001100002100003200000200000200000200000
000002.SZ100000100001100002100003200001200001200001200001
000003.SZ100000100001100002100003200002200002200002200002
000004.SZ100000100001100002100003200003200003200003200003
000005.SZ100000100001100002100003200004200004200004200004
df.columns
# 此时数据的列名是一个多重索引
MultiIndex([(2006, 1),
            (2006, 2),
            (2006, 3),
            (2006, 4),
            (2007, 1),
            (2007, 2),
            (2007, 3),
            (2007, 4)],
           names=['year', 'quarter'])
df_quarter=df.stack() #列转化为行索引
df_quarter.head()
year20062007
codequarter
000001.SZ1100000200000
2100001200000
3100002200000
4100003200000
000002.SZ1100000200001
s_year=df_quarter.stack() #列转化为行索引,再转化一次,这个时候,行就是多重索引了,code,quarter,year
s_year
code       quarter  year
000001.SZ  1        2006    100000
                    2007    200000
           2        2006    100001
                    2007    200000
           3        2006    100002
                    2007    200000
           4        2006    100003
                    2007    200000
000002.SZ  1        2006    100000
                    2007    200001
           2        2006    100001
                    2007    200001
           3        2006    100002
                    2007    200001
           4        2006    100003
                    2007    200001
000003.SZ  1        2006    100000
                    2007    200002
           2        2006    100001
                    2007    200002
           3        2006    100002
                    2007    200002
           4        2006    100003
                    2007    200002
000004.SZ  1        2006    100000
                    2007    200003
           2        2006    100001
                    2007    200003
           3        2006    100002
                    2007    200003
           4        2006    100003
                    2007    200003
000005.SZ  1        2006    100000
                    2007    200004
           2        2006    100001
                    2007    200004
           3        2006    100002
                    2007    200004
           4        2006    100003
                    2007    200004
dtype: int64
df_year=s_year.to_frame()
df_year=df_year.swaplevel(1,2,axis=0) #多级索引中quarter year 交换位置
df_year.rename(columns={0:'值'},inplace=True)
df_year.sort_index(inplace=True) #排个序
df_year
codeyearquarter
000001.SZ20061100000
2100001
3100002
4100003
20071200000
2200000
3200000
4200000
000002.SZ20061100000
2100001
3100002
4100003
20071200001
2200001
3200001
4200001
000003.SZ20061100000
2100001
3100002
4100003
20071200002
2200002
3200002
4200002
000004.SZ20061100000
2100001
3100002
4100003
20071200003
2200003
3200003
4200003
000005.SZ20061100000
2100001
3100002
4100003
20071200004
2200004
3200004
4200004
df_year.to_excel('s_year.xlsx') #保存
# s_year.to_excel('s_year.xlsx',merge_cells=False) 不合并单元格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值