我正在使用一组实例比较一组八个算法(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
这显然不是我想要的。
有人可以帮我吗?
答案 0 :(得分:8)
SeriesGroupBy.rank()
中需要method=dense
,其中各组之间的等级增加1:
df['z_rank'] = df.groupby(['instance', 'D'])['z'].rank(method='dense').astype(int)
答案 1 :(得分:0)
我用以下代码尝试了它。我在FrSeg专栏上得到1分。
Merge_Data['FrSeg'] = Merge_Data.groupby(['CustomerKey'])
['Frequency'].rank(method='dense').astype(int)
我想知道如何将它分成3组。我在频率列中有数字1到68