在DataFrameGroupBy中的字符串上使用熊猫排名

时间:2020-05-30 09:02:58

标签: python-3.x pandas pandas-groupby

我正在研究组织矩阵,并试图用Python重现通常使用MS Access效率很低的任务。对于这个问题可能有一个简单的答案,但是我无法在任何地方找到它,如果已经解决了,抱歉。

让我们在字典中放置一个矩阵并将其放入DF:

matrix ={'Flow':['Flow1','Flow2','Flow3','Flow4','Flow6']*6,
     'User':['Jill','Jacky','Joanie','Peter','Paul','Paddy']*5,
     'Role':['Requestor','Manager','Approver']*10}
mydf=pd.DataFrame(matrix)

这给了我一个流程表,该流程具有三个角色,每个角色可以由几个可能的个人完成(这里只有两个,实际上还有更多)。

对于每个流程/角色对,我都希望按名称进行排名,以便我的数据如下所示:

   Flow    User       Role      Rank
0   Flow1  Jill       Requestor 1
5   Flow1  Paddy      Approver  1
10  Flow1  Paul       Manager   1
15  Flow1  Peter      Requestor 2
20  Flow1  Joanie     Approver  2
25  Flow1  Jacky      Manager   2

,依此类推。这可以是先到先得的基础,字母顺序并不重要。

应该通过使用groupby.rank()

完成此操作
mydf['Rank']=mydf.groupby(['Flow','Role'])['User'].rank(method='dense')

,但这会返回'NoneType'对象不可调用错误。 我的最终目标是透视矩阵以使每个角色都在列中表示,但是我确实需要此排名才能表示所有用户的数据。

请告诉我我在做什么错,也许我需要改用.apply(),但不确定如何使用。

1 个答案:

答案 0 :(得分:0)

您可以将.groupby.cumcount一起使用:

4f682c20697420776f726b7320660202

结果:

mydf['Rank'] = mydf.groupby(['Flow','Role'])['User'].cumcount().add(1)