当前位置:   article > 正文

学习记录647@python之pandas多重索引与列索引转行索引应用_pandas的多重行索引怎么变成行索引

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
MultiIndex([('000001', 2016),
            ('000001', 2017),
            ('600000', 2016),
            ('600000', 2017),
            ('688001', 2016),
            ('688001', 2017)],
           names=['code', 'year'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
 #第1 2行为表头,自动转化为列的多重索引,第一列为行索引
df = pd.read_excel(io = r'test1.xlsx',header=[0,1],index_col=[0])
df.index.name='code'
df.head()
  • 1
  • 2
  • 3
  • 4
year20062007
quarter12341234
code
000001.SZ100000100001100002100003200000200000200000200000
000002.SZ100000100001100002100003200001200001200001200001
000003.SZ100000100001100002100003200002200002200002200002
000004.SZ100000100001100002100003200003200003200003200003
000005.SZ100000100001100002100003200004200004200004200004
df.columns
# 此时数据的列名是一个多重索引
  • 1
  • 2
MultiIndex([(2006, 1),
            (2006, 2),
            (2006, 3),
            (2006, 4),
            (2007, 1),
            (2007, 2),
            (2007, 3),
            (2007, 4)],
           names=['year', 'quarter'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
df_quarter=df.stack() #列转化为行索引
df_quarter.head()
  • 1
  • 2
year20062007
codequarter
000001.SZ1100000200000
2100001200000
3100002200000
4100003200000
000002.SZ1100000200001
s_year=df_quarter.stack() #列转化为行索引,再转化一次,这个时候,行就是多重索引了,code,quarter,year
s_year
  • 1
  • 2
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
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
  • 1
  • 2
  • 3
  • 4
  • 5
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) 不合并单元格
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/663864
推荐阅读
相关标签
  

闽ICP备14008679号