考虑一个包含三列的数据框:group_ID
,item_ID
和value
。假设我们总共有10 itemIDs
。
我需要根据item_ID
对每个group_ID
中的每个value
(1到10)进行排名,然后查看平均排名(以及其他统计信息) )跨群组(例如,群组中最高值的ID会使排名更接近1)。我怎么能这样做
熊猫?
This answer与qcut
非常接近,但不完全相同。
数据示例如下:
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
答案 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
但是请注意,如果你没有使用全局排名方案,找出组间的平均排名并不是很有意义 - 除非组中有重复的值(因此你有重复的排名值)所有你正在做的是测量一组中有多少元素。