根据两列进行排序并将值分配给新列

时间:2018-01-22 16:02:48

标签: python pandas sorting

我的数据框为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

我需要排序问题的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用

  1. groupby获取每个ID
  2. 的子DataFrame
  3. nsmallest识别这些阈值元素。
  4. transform获取每个子DataFrame并获得分数。
  5. 代码:

    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习语。