大熊猫的排名

时间:2018-05-09 13:40:52

标签: python pandas rank

我有这样的数字,我想按顺序排列它们,我尝试使用 (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 :(得分:2)

按比例移位groupbySeries创建的连续组使用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

答案 1 :(得分:1)

好像你想对连续的数字进行排名,所以我们需要在这里创建额外的组密钥

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

答案 2 :(得分:1)

您不需要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