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