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