2015-11-24 21 views
5

考慮具有三列的數據幀:group_ID,item_IDvalue。假設我們共有10 itemIDsPandas中的每個組的排名順序

我需要排名各item_ID(1〜10)每個group_ID基於value,然後看到平均等級(和其它數據)跨羣體(如各組與最高值的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 
+0

您可以使用'scipy.stats'中的'rankdata'函數對您的數據進行排序。然後,它將成爲將這個函數正確分組並應用於數據框的練習。 – Olaf

+0

謝謝@DSM我正在編輯帖子。我認爲最新的排名是正確的。 –

+0

是的! @DSM對不起,我剛剛糾正了這一點。謝謝。 –

回答

8

有很多不同的參數可以傳遞給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 

但要注意的是,如果你不使用全球排名方案,找出各組的平均排名不非常有意義 - 除非組中有重複值(因此您有重複的等級值),您所做的只是測量組中有多少元素。