根据列

时间:2017-09-27 21:17:20

标签: python pandas

我有一个如下所示的数据集:

OwnerID    GroupID    AssignmentID   ... <few more columns>  [Need this column]
1           10         100                                    1
1           10         100                                    1
1           10         200                                    2
1           20         100                                    1
1           20         200                                    2
1           20         300                                    3
2           30         200                                    1
2           30         200                                    1
2           40         300                                    2

我想根据OwnerIDGroupIDAssignmentID字段中的值填充列。如果这些字段中的值在行之间相同,那么我希望在新列中重复数字1。但是,如果同一所有者已为同一组分配了不同的分配,则新列中的值应递增。

例如 - OwnerID 1分配了2个分配(2个具有相同的AssignmentID 100,另一个分配了AssignmentID 200个分配。 AssignmentID 100在两种情况下都会获得值1,因为OwnerIDGroupIDAssignmentID的值相同,但在AssignmentID时得到值2 {1}}是200。

同样,当OwnerID 100分配AssignmentID 100,200和300时,分配了这些作业的组已更改为20。

我认为可以使用以下代码完成:

AssignmentDetails['colname'] = AssignmentDetails.groupby(['ownerid','groupid','assignmentid']).cumcount()

但这并没有给我所需的结果。当'groupby'子句中的值相同时,它不会重复新列中的值,但会增加值。

我如何实现这一目标?任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

df.assign(
    result=df.groupby(
        ['OwnerID', 'GroupID']
    ).AssignmentID.transform(lambda x: x.factorize()[0]) + 1
)

   OwnerID  GroupID  AssignmentID  Result  result
0        1       10           100       1       1
1        1       10           100       1       1
2        1       10           200       2       2
3        1       20           100       1       1
4        1       20           200       1       2
5        1       20           300       1       3
6        2       30           200       1       1
7        2       30           200       1       1
8        2       40           300       2       1

答案 1 :(得分:1)

df.groupby([ 'OwnerID' , 'GroupID' ]).AssignmentID.transform(lambda x: x.astype('category').cat.codes.add(1))
Out[186]: 
0    1
1    1
2    2
3    1
4    2
5    3
6    1
7    1
8    1
Name: AssignmentID, dtype: int8