2017-01-16 132 views
2

我使用一组实例比较一组八个算法(solver列),每个实例对于每个算法都执行一次,并且参数的级别为D(从1到10 )。因此,得出的数据帧应该是这样的:使用python-pandas的组内排名

  instance D z    solver 
0 1000_ep0.0075 1 994   threatened 
1 1000_ep0.0075 1 993    desc 
2 1000_ep0.0075 1 994    degree 
3 1000_ep0.0075 1 993 threatened_desc 
4 1000_ep0.0075 1 993 threatened_degree 
5 1000_ep0.0075 1 994   desc_later 
6 1000_ep0.0075 1 994  degree_later 
7 1000_ep0.0075 1 993   dyn_degree 
8 1000_ep0.0075 2 986   threatened 
9 1000_ep0.0075 2 987    desc 
10 1000_ep0.0075 2 988    degree 
11 1000_ep0.0075 2 987 threatened_desc 
12 1000_ep0.0075 2 986 threatened_degree 
13 1000_ep0.0075 2 987   desc_later 
14 1000_ep0.0075 2 988  degree_later 
15 1000_ep0.0075 2 987   dyn_degree 
.... 

z列对应于由算法找到的值(越小越好)。

我想添加一个列到数据框,对应于每个算法的排名,根据z的值为每个组合<instance, D>。对于上面的例子,会是这样的:

  instance D z    solver z_rank 
0 1000_ep0.0075 1 994   threatened 2 
1 1000_ep0.0075 1 993    desc 1 
2 1000_ep0.0075 1 994    degree 2 
3 1000_ep0.0075 1 993 threatened_desc 1 
4 1000_ep0.0075 1 993 threatened_degree 1 
5 1000_ep0.0075 1 994   desc_later 2 
6 1000_ep0.0075 1 994  degree_later 2 
7 1000_ep0.0075 1 993   dyn_degree 1 
8 1000_ep0.0075 2 986   threatened 1 
9 1000_ep0.0075 2 987    desc 2 
10 1000_ep0.0075 2 988    degree 3 
11 1000_ep0.0075 2 987 threatened_desc 2 
12 1000_ep0.0075 2 986 threatened_degree 1 
13 1000_ep0.0075 2 987   desc_later 2 
14 1000_ep0.0075 2 988  degree_later 3 
15 1000_ep0.0075 2 987   dyn_degree 2 
... 

使用python-pandas,这是我能得到迄今:

df.loc[:, 'z_rank'] = df_rg.groupby(['instance', 'D'])['z'].rank() 
df.head(16) 
     instance D z    solver z_rank 
0 1000_ep0.0075 1 994   threatened 47.5 
1 1000_ep0.0075 1 993    desc 16.5 
2 1000_ep0.0075 1 994    degree 47.5 
3 1000_ep0.0075 1 993 threatened_desc 16.5 
4 1000_ep0.0075 1 993 threatened_degree 16.5 
5 1000_ep0.0075 1 994   desc_later 47.5 
6 1000_ep0.0075 1 994  degree_later 47.5 
7 1000_ep0.0075 1 993   dyn_degree 16.5 
8 1000_ep0.0075 2 986   threatened  7.0 
9 1000_ep0.0075 2 987    desc 18.5 
10 1000_ep0.0075 2 988    degree 44.5 
11 1000_ep0.0075 2 987 threatened_desc 18.5 
12 1000_ep0.0075 2 986 threatened_degree  7.0 
13 1000_ep0.0075 2 987   desc_later 18.5 
14 1000_ep0.0075 2 988  degree_later 44.5 
15 1000_ep0.0075 2 987   dyn_degree 18.5 

这显然不是我想要的。

有人能帮助我吗?

回答

5

您需要method=denseSeriesGroupBy.rank()其中的行列组间增加1:

df['z_rank'] = df.groupby(['instance', 'D'])['z'].rank(method='dense').astype(int) 

enter image description here

+0

不错!谢谢!有没有办法不增加组之间的排名? –

+0

那么,在这种情况下输出将如何呢? –

+0

因为当我在整个df中应用密集方法时,我得到以下内容:http://pastebin.com/raw/9me5tnTa。 在第一组中,最小等级是3,其中应该是1.我认为这是因为组之间的增加功能 –

0

我用下面的代码试了一下。我在FrSeg专栏中得到1分。我想知道如何把它分成3组。我在频率栏中有1到68的数字