使用python-pandas在组内排名

时间:2017-01-16 17:14:26

标签: python-3.x pandas data-analysis

我正在使用一组实例比较一组八个算法(solver列),每个实例对每个算法执行一次,参数级别D(从1到1) 10)。因此,结果数据框将如下所示:

         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的{​​{1}}值,对应每个算法的排名。对于上面的例子,将是这样的:

<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

这显然不是我想要的。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:8)

SeriesGroupBy.rank()中需要method=dense,其中各组之间的等级增加1:

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

enter image description here

答案 1 :(得分:0)

我用以下代码尝试了它。我在FrSeg专栏上得到1分。

Merge_Data['FrSeg'] = Merge_Data.groupby(['CustomerKey'])
['Frequency'].rank(method='dense').astype(int)

我想知道如何将它分成3组。我在频率列中有数字1到68