我的数据框为df
(使用pandas模块创建):
ID Distance
0 105 86.7
1 105 60.5
2 106 48.3
3 106 14.1
4 106 37.2
5 106 30.8
我正在尝试创建一个列("Score"
),表示基于相同"ID"
的最小距离得分。
换句话说,对于具有相同"ID"
的对象,应用以下规则;
如果对象具有最小距离,"Score"
将获得值“4”。
如果对象具有第二个最小距离,"Score"
将获得值“2”。
如果对象具有第3个最小距离,"Score"
将获得值“1”。
如果对象有第4个和第n个。最小距离"Score"
将获得值“0”。
这是我预期的Out_df
:
ID Distance Score
0 105 86.7 2
1 105 60.5 4
2 106 48.3 0
3 106 14.1 4
4 106 37.2 1
5 106 30.8 2
我需要排序问题的帮助。
答案 0 :(得分:1)
您可以使用
groupby
获取每个ID
nsmallest
识别这些阈值元素。transform
获取每个子DataFrame并获得分数。代码:
def my_sort(s):
d = dict(zip(s.nsmallest(3), [4, 2, 1]))
return [d.get(v, 0) for v in s]
df['Score'] = df.groupby('ID').transform(my_sort)
查看pandas groupby docs了解有用的groupby
习语。