拆分pandas数据帧索引

时间:2016-03-02 10:03:23

标签: pandas matplotlib

我有一个非常大的数据框,其中包含列名称类别(外贸统计),而索引是包含国家/地区代码和年份的字符串:w2013表示 World ,2013年,r2015含义< em>俄罗斯联邦,2015年。

Index([u'w2011', u'c2011', u'g2011', u'i2011', u'r2011', u'w2012', u'c2012',
   u'g2012', u'i2012', u'r2012', u'w2013', u'c2013', u'g2013', u'i2013',
   u'r2013', u'w2014', u'c2014', u'g2014', u'i2014', u'r2014', u'w2015',
   u'c2015', u'g2015', u'i2015', u'r2015'],
  dtype='object')

制作用于绘制各列的多重索引的最简单方法是什么?我需要为每个国家和每年绘制一个列?

2 个答案:

答案 0 :(得分:2)

您可以尝试创建Multiindex from_tuples - 提取字母使用indexing with str

import pandas as pd

li =[u'w2011', u'c2011', u'g2011', u'i2011', u'r2011', u'w2012', u'c2012',
   u'g2012', u'i2012', u'r2012', u'w2013', u'c2013', u'g2013', u'i2013',
   u'r2013', u'w2014', u'c2014', u'g2014', u'i2014', u'r2014', u'w2015',
   u'c2015', u'g2015', u'i2015', u'r2015']

df = pd.DataFrame(range(25), index = li, columns=['a'])
print df
        a
w2011   0
c2011   1
g2011   2
i2011   3
r2011   4
w2012   5
c2012   6
g2012   7
i2012   8
r2012   9
w2013  10
c2013  11
g2013  12
i2013  13
r2013  14
w2014  15
c2014  16
g2014  17
i2014  18
r2014  19
w2015  20
c2015  21
g2015  22
i2015  23
r2015  24
print df.index.str[0]
Index([u'w', u'c', u'g', u'i', u'r', u'w', u'c', u'g', u'i', u'r', u'w', u'c',
       u'g', u'i', u'r', u'w', u'c', u'g', u'i', u'r', u'w', u'c', u'g', u'i',
       u'r'],
      dtype='object')

print df.index.str[1:]
Index([u'2011', u'2011', u'2011', u'2011', u'2011', u'2012', u'2012', u'2012',
       u'2012', u'2012', u'2013', u'2013', u'2013', u'2013', u'2013', u'2014',
       u'2014', u'2014', u'2014', u'2014', u'2015', u'2015', u'2015', u'2015',
       u'2015'],
      dtype='object')

df.index = pd.MultiIndex.from_tuples(zip(df.index.str[0], df.index.str[1:]))
print df
         a
w 2011   0
c 2011   1
g 2011   2
i 2011   3
r 2011   4
w 2012   5
c 2012   6
g 2012   7
i 2012   8
r 2012   9
w 2013  10
c 2013  11
g 2013  12
i 2013  13
r 2013  14
w 2014  15
c 2014  16
g 2014  17
i 2014  18
r 2014  19
w 2015  20
c 2015  21
g 2015  22
i 2015  23
r 2015  24

如果您需要将years转换为int,请使用astype

df.index = pd.MultiIndex.from_tuples(zip(df.index.str[0], df.index.str[1:].astype(int)))

print df.index
MultiIndex(levels=[[u'c', u'g', u'i', u'r', u'w'], [2011, 2012, 2013, 2014, 2015]],
           labels=[[4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3], [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]])

答案 1 :(得分:1)

如果我理解得很好,你可以:

  1. 重置索引

    df.reset_index(inplace=1)
    
  2. 创建另外两列,一个用于年份,另一个用于国家/地区:

    df.loc[,"year"] = df.foo.apply(lambda x: x[1:])
    df.loc[,"country"] = df.foo.apply(lambda x: x[0])
    
  3. 假设您之前索引的列名为foo,并且国家/地区代码的长度为1.您可以采用其他方式进行调整。

    1. 将这两列设为索引:

      df.set_index(["year", "country"], inplace=1)
      
    2. HTH