ранговые числа в пандах - PullRequest
0 голосов
/ 09 мая 2018

У меня есть такие числа, я хочу привести их в порядок, как в колонке 'order' , Я пытался использовать (a.assign(rs=a.sort_values(['seq'], ascending=True).groupby(['qq'])'seq'].rank(method='first'))) но то, что я получил, это столбец «результат», а это не то, что я хочу, так есть ли способ, к которому я могу обратиться?

qq          seq   order result
2881017171  6730    1   1
2881017170  6731    1   1
644128000   6732    1   1
644128000   6733    2   2
2881017198  6734    1   1
644128000   6735    1   3
2881017198  6736    1   2
2881017192  6737    1   1
644128000   6738    1   4
2881017192  6739    1   2
2881017198  6740    1   3
285207386   6741    1   1
2881017198  6742    1   4
285207386   6743    1   2
2881017198  6744    1   5
2881017188  6745    1   1
2881017170  6746    1   2
2881017170  6747    2   3
2881017170  6748    3   4
644128000   6750    1   5
2881017198  6751    1   6
2881017192  6752    1   3
2881017192  6753    2   4

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Использование groupby последовательными группами, созданными сравнением смещенных Series и cumsum:

df['result']=df.groupby(df.qq.ne(df.qq.shift()).cumsum()).seq.rank(method='first').astype(int)
print (df)
            qq   seq  order  result
0   2881017171  6730      1       1
1   2881017170  6731      1       1
2    644128000  6732      1       1
3    644128000  6733      2       2
4   2881017198  6734      1       1
5    644128000  6735      1       1
6   2881017198  6736      1       1
7   2881017192  6737      1       1
8    644128000  6738      1       1
9   2881017192  6739      1       1
10  2881017198  6740      1       1
11   285207386  6741      1       1
12  2881017198  6742      1       1
13   285207386  6743      1       1
14  2881017198  6744      1       1
15  2881017188  6745      1       1
16  2881017170  6746      1       1
17  2881017170  6747      2       2
18  2881017170  6748      3       3
19   644128000  6750      1       1
20  2881017198  6751      1       1
21  2881017192  6752      1       1
22  2881017192  6753      2       2
0 голосов
/ 09 мая 2018

Вам не нужно rank. Вы можете использовать cumcount в groupby контексте

df.assign(
    result=df.groupby(
        df.qq.ne(df.qq.shift()).cumsum()
    ).cumcount() + 1
)

            qq   seq  order  result
0   2881017171  6730      1       1
1   2881017170  6731      1       1
2    644128000  6732      1       1
3    644128000  6733      2       2
4   2881017198  6734      1       1
5    644128000  6735      1       1
6   2881017198  6736      1       1
7   2881017192  6737      1       1
8    644128000  6738      1       1
9   2881017192  6739      1       1
10  2881017198  6740      1       1
11   285207386  6741      1       1
12  2881017198  6742      1       1
13   285207386  6743      1       1
14  2881017198  6744      1       1
15  2881017188  6745      1       1
16  2881017170  6746      1       1
17  2881017170  6747      2       2
18  2881017170  6748      3       3
19   644128000  6750      1       1
20  2881017198  6751      1       1
21  2881017192  6752      1       1
22  2881017192  6753      2       2
0 голосов
/ 09 мая 2018

Похоже, вы хотите ранжировать последовательный номер, поэтому нам нужно создать дополнительный ключ группы здесь

df.groupby(df.qq.diff().ne(0).cumsum()).seq.rank(method='first').astype(int)
Out[893]: 
0     1
1     1
2     1
3     2
4     1
5     1
6     1
7     1
8     1
9     1
10    1
11    1
12    1
13    1
14    1
15    1
16    1
17    2
18    3
19    1
20    1
21    1
22    2
Name: seq, dtype: int32

Информация для ключа

df.qq.diff().ne(0).cumsum()
Out[892]: 
0      1
1      2
2      3
3      3
4      4
5      5
6      6
7      7
8      8
9      9
10    10
11    11
12    12
13    13
14    14
15    15
16    16
17    16
18    16
19    17
20    18
21    19
22    19
Name: qq, dtype: int32
...