【问题标题】:Using Pandas Rank on strings in DataFrameGroupBy对 DataFrameGroupBy 中的字符串使用 Pandas Rank
【发布时间】:2020-05-30 09:02:58
【问题描述】:

我正在研究一个组织矩阵,并试图在 Python 中重现一个通常使用 MS Access 非常低效地完成的任务。这个问题可能有一个简单的答案,但我无法在任何地方找到它,如果这个问题已经得到解答,我们深表歉意。

让我们在 dict 中设置一个矩阵并将其放入 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' object is not callable 错误。 我的最终目标是旋转矩阵以使每个角色在一列中表示,但我确实需要这个排名才能代表所有用户的数据。

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

【问题讨论】:

  • “按名称排名”是什么意思 - 按字母顺序排列?如果是这样,您提供的示例输出似乎没有这样做。

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


【解决方案1】:

您可以使用.groupby,以及.cumcount

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

结果:

# print(mydf[mydf['Flow'].eq('Flow1')])

    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

【讨论】:

  • 谢谢,这正是我所需要的!
猜你喜欢
  • 2022-11-28
  • 2022-01-26
  • 1970-01-01
  • 2018-03-02
  • 2023-03-24
  • 2014-02-02
  • 2021-12-28
相关资源
最近更新 更多