2015-11-24 9 views
5

group_ID,item_IDおよびvalueの3つの列を持つデータフレームを考えてみましょう。合計で10 itemIDsがあるとします。パンダのグループごとの順位付け

私はランク付けする必要がある各item_ID内(1〜10)の各group_IDvalueに基づいて、その後、例えばグループ全体最高値を持つ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

'scipy.stats'の' rankdata'関数を使ってデータのランク付けを行うことができます。次に、この機能を適切にグループ化してデータフレームに適用するエクササイズになります。 – Olaf

+0

ありがとう@DSM私は投稿を編集中でした。私は最新のランキングが正しいと思います。 –

+0

はい! @DSM申し訳ありません、ただ修正しました。ありがとう。 –

答えて

8

あなたはrankに渡すことができる異なる引数がたくさんあります。あなたがgroupbyを行った後、あなたが望む結果を得るためにrank("dense", ascending=False)を使用することができますように見えます:

>>> 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 

しかし、あなたはグローバルなランキングスキームを使用していない場合は、グループ全体での平均順位を見つけることではないことに注意してください非常に意味があります。グループ内に重複した値がある場合(そして、重複したランクの値を持っている場合を除き)、グループ内にいくつの要素があるかを測定するだけです。