Python根据每个输入不同的另一列进行排序
我想在前三栏的基础上提出以下第四栏:Python根据每个输入不同的另一列进行排序,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我想在前三栏的基础上提出以下第四栏: user job time Rank A print 1559 2 A print 1540 2 A edit 1520 1 A edit 1523 1 A deliver 9717 3 B edit 1717 2 B edit 1716 2 B edit 1715 2 B deliver 1527 1 B deliver 1524
user job time Rank
A print 1559 2
A print 1540 2
A edit 1520 1
A edit 1523 1
A deliver 9717 3
B edit 1717 2
B edit 1716 2
B edit 1715 2
B deliver 1527 1
B deliver 1524 1
第4列中的排名对于每个用户第1列是独立的。对于每个用户,我想根据第三列的值对第二列进行排名。例如,对于用户A,他/她有三份工作要做。因为“编辑”的时间值最小,编辑次之,交付最大,所以三者的排名分别为编辑-1、打印-2和交付-3
我知道我应该从groupby的第一列开始,但不知何故,我无法计算如何根据每行不同的第三列对第二列进行排序 首先,分配一个新列,其中包含用户作业对的最短时间:
df['min_time'] = df.groupby(['user', 'job'])['time'].transform('min')
然后按每个用户分组并对其进行排名:
df.groupby('user')['min_time'].rank(method='dense').astype(int)
Out:
0 2
1 2
2 1
3 1
4 3
5 2
6 2
7 2
8 1
9 1
Name: min_time, dtype: int64
首先,分配一个新列,其中包含用户作业对的最短时间:
df['min_time'] = df.groupby(['user', 'job'])['time'].transform('min')
然后按每个用户分组并对其进行排名:
df.groupby('user')['min_time'].rank(method='dense').astype(int)
Out:
0 2
1 2
2 1
3 1
4 3
5 2
6 2
7 2
8 1
9 1
Name: min_time, dtype: int64
或者你可以使用
df1=df1.sort_values(['user','time'],ascending=[True,True])
df1['Rank']=df1.job!=df1.job.shift().fillna('edit')
df1.Rank=df1.groupby('user').Rank.cumsum()+1
user job time Rank
0 A print 1559 2.0
1 A print 1540 2.0
2 A edit 1520 1.0
3 A edit 1523 1.0
4 A deliver 9717 3.0
5 B edit 1717 2.0
6 B edit 1716 2.0
7 B edit 1715 2.0
8 B deliver 1527 1.0
9 B deliver 1524 1.0
或者你可以使用
df1=df1.sort_values(['user','time'],ascending=[True,True])
df1['Rank']=df1.job!=df1.job.shift().fillna('edit')
df1.Rank=df1.groupby('user').Rank.cumsum()+1
user job time Rank
0 A print 1559 2.0
1 A print 1540 2.0
2 A edit 1520 1.0
3 A edit 1523 1.0
4 A deliver 9717 3.0
5 B edit 1717 2.0
6 B edit 1716 2.0
7 B edit 1715 2.0
8 B deliver 1527 1.0
9 B deliver 1524 1.0