在 pandas 中排名数字
rank numbers in pandas
我有这样的数字,我想把它们像'order'栏一样排序,我试过用
(a.assign(rs=a.sort_values(['seq'], ascending=True).groupby(['qq'])'seq'].rank(method='first')))
但是我得到的是 'result' 列,这不是我想要的,所以我有什么办法可以求助吗?
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
好像你想对连续的数字进行排名,所以我们需要在这里创建额外的组密钥
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
使用 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
您不需要 rank
。您可以在 groupby
上下文
中使用 cumcount
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
我有这样的数字,我想把它们像'order'栏一样排序,我试过用
(a.assign(rs=a.sort_values(['seq'], ascending=True).groupby(['qq'])'seq'].rank(method='first')))
但是我得到的是 'result' 列,这不是我想要的,所以我有什么办法可以求助吗?
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
好像你想对连续的数字进行排名,所以我们需要在这里创建额外的组密钥
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
使用 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
您不需要 rank
。您可以在 groupby
上下文
cumcount
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