Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在DataFrameGroupBy中使用字符串排序_Python 3.x_Pandas_Pandas Groupby - Fatal编程技术网

Python 3.x 在DataFrameGroupBy中使用字符串排序

Python 3.x 在DataFrameGroupBy中使用字符串排序,python-3.x,pandas,pandas-groupby,Python 3.x,Pandas,Pandas Groupby,我正在研究一个组织矩阵,并试图用Python重现一个任务,通常使用MS Access来完成这个任务效率很低。这个问题可能有一个简单的答案,但我在任何地方都找不到,如果这个问题已经得到了回答,我表示歉意 让我们在dict中放置一个矩阵,并将其放在DF中: matrix ={'Flow':['Flow1','Flow2','Flow3','Flow4','Flow6']*6, 'User':['Jill','Jacky','Joanie','Peter','Paul','Paddy']*5

我正在研究一个组织矩阵,并试图用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()来完成

但这将返回一个“非类型”对象不可调用的错误。 我的最终目标是调整矩阵,使每个角色都在一列中表示,但我确实需要这个排名,以便能够表示所有用户的数据

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

您可以使用,以及:

结果:

# 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

你所说的“按姓名排名”——按字母顺序排列是什么意思?如果是这样的话,您提供的示例输出似乎不是这样的。谢谢,这正是我所需要的!
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