在Pandas中按组排序

时间:2015-11-24 16:50:23

标签: python pandas

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

我需要根据item_ID对每个group_ID中的每个value(1到10)进行排名,然后查看平均排名(以及其他统计信息) )跨群组(例如,群组中最高值的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

1 个答案:

答案 0 :(得分:14)

你可以传递给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

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