【问题标题】:Rank within groups using python-pandas使用 python-pandas 在组内排名
【发布时间】:2017-05-31 14:24:09
【问题描述】:

我正在使用一组实例比较一组八个算法(solver 列),每个实例对每个算法执行一次,参数级别为D(从 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 列对应于算法找到的值(越小越好)。

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

         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

这显然不是我想要的。

有人可以帮我吗?

【问题讨论】:

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


    【解决方案1】:

    您需要 method=denseSeriesGroupBy.rank() 中,其中组间的等级增加 1:

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

    【讨论】:

    • 不错!谢谢!有什么办法不增加组间排名?
    • 那么,在这种情况下输出会是怎样的呢?
    • 因为当我在整个df中应用dense方法时,我得到以下信息:pastebin.com/raw/9me5tnTa。在第一组中,最小的排名是 3,应该是 1。我想那是因为组之间的增加特征
    • 不,在所附屏幕截图下方可能存在一些 (1000_ep0.0075, 1),其 D 值低于 993。您可以先执行 df.sort_values(['instance', 'D'], inplace=True) 以获得清晰的画面。 method=dense 基本上所做的就是以数字方式为组中的元素分配等级,这些元素按从升序(最小值 = 1)到降序的顺序增加。
    • 我想我明白了。谢谢!
    【解决方案2】:

    我用下面的代码试了一下。我在 FrSeg 列上得到 1。

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 2018-11-05
      • 2015-03-06
      • 1970-01-01
      • 2019-05-26
      • 2023-02-02
      • 2016-11-22
      • 1970-01-01
      相关资源
      最近更新 更多