2016-05-30 6 views
-1

から基づいて、現在の行の比較、私は私が見つけたいDF例えば、他の行

ID Name Value 
0 A  10 
1 A  11 
3 A  15 
4 B  7 
5 B  11 
C X  1 

を持って、現在の行のために、同じ名前と大きな価値を持っているどのように多くの他の行カウント。 期待される出力。

ID Name Value Res 
0 A  10  2 
1 A  11  1 
3 A  15  0 
4 B  7  1 
5 B  11  0 
6 X  1  0 

編集:追加のケース。微調整のビットでタグ= 1

ID Name Value Tag Res 
0 A  9  1 2 
1 A  10  0 2 
2 A  11  1 1 
3 A  15  1 0 
4 B  7  1 1 
5 B  11  1 0 
6 X  1  1 0 

答えて

3

数にのみを含め、あなたはmethod='dense'Series.rankを使用することができます。

>>> grouped = df.groupby("Name")["Value"] 
>>> df["Res"] = grouped.rank(method="dense", ascending=False).astype(int) - 1 
>>> df 
    ID Name Value Res 
0 0 A  10 2 
1 1 A  11 1 
2 3 A  15 0 
3 4 B  7 1 
4 5 B  11 0 
5 C X  1 0 
+0

ありがとう!これは機能します。私のデータには別のケースがあるようだ。私は私の質問を更新しました。 – arkisle