在彼此不相邻的子组中排序-熊猫

时间:2020-03-27 17:10:59

标签: python pandas

以下是样本DF:

id sim   sub_group sub_group_rank
a. 0.90  4         1
a. 0.87  2         1
a. 0.80  3         2
a. 0.75  1         1
a. 0.73  3         3
a. 0.70  5         1
a. 0.68  3         1
b. 0.90  1         2
b. 0.87  2         2
b. 0.80  2         1
b. 0.75  3         1
b. 0.73  4         1
b. 0.70  5         1
b. 0.68  1         1

这里是逻辑:

  1. idsim排序
  2. 在子组中排序。注意:我需要维持每个id内的顺序,并仅基于sub_group中的行对sub_group_rank中的行重新排序。看一下sub_group a中id 3的重新排序方式。

更新的DF:

id sim   sub_group sub_group_rank
a. 0.90  4         1
a. 0.87  2         1
a. 0.68  3         1
a. 0.75  1         1
a. 0.80  3         2
a. 0.70  5         1
a. 0.73  3         3
b. 0.68  1         1
b. 0.80  2         1
b. 0.87  2         2
b. 0.75  3         1
b. 0.73  4         1
b. 0.70  5         1
b. 0.90  1         2

我不太确定如何在熊猫中做到这一点。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

IIUC:

df.loc[(df.groupby(['id','sub_group'])
   .sub_group_rank.transform(lambda x: x.sort_values().index)
)]

输出:

    id   sim  sub_group  sub_group_rank
0   a.  0.90          4               1
1   a.  0.87          2               1
6   a.  0.68          3               1
3   a.  0.75          1               1
2   a.  0.80          3               2
5   a.  0.70          5               1
4   a.  0.73          3               3
13  b.  0.68          1               1
9   b.  0.80          2               1
8   b.  0.87          2               2
10  b.  0.75          3               1
11  b.  0.73          4               1
12  b.  0.70          5               1
7   b.  0.90          1               2