多索引DF的排名

时间:2014-09-22 22:06:20

标签: python pandas

我有一个多索引DF,结构如下:

>>> df = pd.DataFrame({(2014, 'value'): {('AR', 0): 1.2420, ('AR', 1): 0.1802,('BR', 0): 1.3,('BR', 1): 0.18}})
>>> print df

      2014
      value
AR 0  1.2420
   1  0.1802
BR 0  1.3000
   1  0.1800

我的目标是添加一个列'排名',其中包含国家/地区的排名(AR& BR)0& 1按降序排列。期望的结果将是:

            2014          
            value   rank 
iso   id
AR    0     1.2420  2      
      1     0.1802  1    
BR    0     1.3     1    
      1     0.18    2  

我最初的方法是重置索引:

>>> df = df.reset_index()
>>> print df

       level_0   level_1   2014
                           value
0      AR        0         1.2420
1      AR        1         0.1802
2      BR        0         1.3000
3      BR        1         0.1800

然后使用groupby和rank添加'rank'列:

>>> df[2014, 'gr'] =  df.groupby(['level_1'])[2014, 'value'].rank(ascending=False)

然而,结果如下:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/groupby.py", line 2990, in __getitem__
    if len(self.obj.columns.intersection(key)) != len(key):
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/index.py", line 3774, in intersection
    result_names = self.names if self.names == other.names else None
AttributeError: 'tuple' object has no attribute 'names'

我是否走上了正确的道路,我应该考虑另一种方法?

1 个答案:

答案 0 :(得分:2)

所以等级来自value对吗?我想这就是你想要的:

In [13]: df.groupby(level=1).rank(ascending=False)
Out[13]: 
      2014
     value
AR 0     2
   1     1
BR 0     1
   1     2

您可以使用df['rank'] = df.groupby(level=1).rank(ascending=False)

进行设置