2016-03-02 270 views
1

我有一個相當大的數據框與列名的類別(外貿統計),而該指數是包含國家代碼和年份的字符串:W2013意味着世界,預計到2013年,r2015意思俄羅斯聯邦,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

您可以嘗試創建Multiindexfrom_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 

如果需要轉換yearsint,使用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. 重置指數

    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]) 
    

假設你的前索引列中是稱爲foo,並且國家代碼的長度爲1.您可以進行其他調整。

  • 設置那些兩列指數:

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