【问题标题】:Ranking order per group in PandasPandas中每组的排名顺序
【发布时间】:2015-11-25 01:49:51
【问题描述】:

考虑一个包含三列的数据框:group_IDitem_IDvalue。假设我们总共有 10 个itemIDs

我需要根据value 对每个item_ID(1 到 10)每个group_ID 进行排名,然后查看各组的平均排名(和其他统计数据)(例如在各组中具有最高值的 ID 将获得更接近 1) 的排名。我怎样才能做到这一点 熊猫?

This answerqcut 的作用非常接近,但并不完全相同。


数据示例如下所示:

      group_ID   item_ID  value
0   0S00A1HZEy        AB     10
1   0S00A1HZEy        AY      4
2   0S00A1HZEy        AC     35
3   0S03jpFRaC        AY     90
4   0S03jpFRaC        A5      3
5   0S03jpFRaC        A3     10
6   0S03jpFRaC        A2      8
7   0S03jpFRaC        A4      9
8   0S03jpFRaC        A6      2
9   0S03jpFRaC        AX      0

这会导致:

      group_ID   item_ID   rank
0   0S00A1HZEy        AB      2
1   0S00A1HZEy        AY      3
2   0S00A1HZEy        AC      1
3   0S03jpFRaC        AY      1
4   0S03jpFRaC        A5      5
5   0S03jpFRaC        A3      2
6   0S03jpFRaC        A2      4
7   0S03jpFRaC        A4      3
8   0S03jpFRaC        A6      6
9   0S03jpFRaC        AX      7

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将许多不同的参数传递给rank;看起来你可以使用rank("dense", ascending=False) 来获得你想要的结果,在做groupby 之后:

    >>> df["rank"] = df.groupby("group_ID")["value"].rank("dense", ascending=False)
    >>> df
         group_ID item_ID  value  rank
    0  0S00A1HZEy      AB     10     2
    1  0S00A1HZEy      AY      4     3
    2  0S00A1HZEy      AC     35     1
    3  0S03jpFRaS      AY     90     1
    4  0S03jpFRaS      A5      3     5
    5  0S03jpFRaS      A3     10     2
    6  0S03jpFRaS      A2      8     4
    7  0S03jpFRaS      A4      9     3
    8  0S03jpFRaS      A6      2     6
    9  0S03jpFRaS      AX      0     7
    

    但请注意,如果您不使用全局排名方案,则找出组间的平均排名并不是很有意义 - 除非组中有重复的值(因此您有重复的排名值) '正在测量一个组中有多少元素。

    【讨论】:

    • 很好的答案。我不得不根据我的要求使用 rank('min'..) 来处理重复值。对于值 100,100,105。 'dense' 分配等级为 1,1,2,'min' 分配为 1,1,3
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2018-11-05
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多