添加具有关于groupby操作的元素编号的列,而不包含循环

时间:2016-11-10 15:17:54

标签: python sorting pandas count group-by

我设法在我的pandas数据框中添加了一个列,其中包含与组相关的内部编号。

这是输入数据帧:

df = pd.DataFrame({
     'name': ['Name1','Name2','Name3','Name4','Name5','Name6', 'Name7', 'Name8'], 
     'group':['GroupB','GroupB','GroupB','GroupA','GroupA','GroupA', 'GroupC', 'GroupC'],
     'revenue':[1,2,3,4,5,6,11,22]}
)

看起来像那样:

    group   name    revenue
0   GroupB  Name1   1
1   GroupB  Name2   2
2   GroupB  Name3   3
3   GroupA  Name4   4
4   GroupA  Name5   5
5   GroupA  Name6   6
6   GroupC  Name7   11
7   GroupC  Name8   22

我想要像这样的输出

    group   name    revenue Group_internal_id
0   GroupA  Name4   4   0
1   GroupA  Name5   5   1
2   GroupA  Name6   6   2
3   GroupB  Name1   1   0
4   GroupB  Name2   2   1
5   GroupB  Name3   3   2
6   GroupC  Name7   11  0
7   GroupC  Name8   22  1

我设法使用以下代码获取数据帧outDF中我想要的输出:

numbering_function = lambda x: range(len(x.index))

outDF = pd.DataFrame()
for iK, iDF in df.groupby('group'):
    tempDF = iDF.copy()
    tempDF['Group_internal_id'] = numbering_function(tempDF)
    outDF = outDF.append(tempDF, ignore_index=True)

然后outDF看起来如下:

group   name    revenue Group_internal_id
0   GroupA  Name4   4   0
1   GroupA  Name5   5   1
2   GroupA  Name6   6   2
3   GroupB  Name1   1   0
4   GroupB  Name2   2   1
5   GroupB  Name3   3   2
6   GroupC  Name7   11  0
7   GroupC  Name8   22  1

我想找到一种方法来获得相同的输出数据帧而不使用循环。

谢谢!

1 个答案:

答案 0 :(得分:2)

cumcount需要sort_values

df['new'] = df.groupby('group').cumcount()
df = df.sort_values('group')
print (df)
    group   name  revenue  new
3  GroupA  Name4        4    0
4  GroupA  Name5        5    1
5  GroupA  Name6        6    2
0  GroupB  Name1        1    0
1  GroupB  Name2        2    1
2  GroupB  Name3        3    2
6  GroupC  Name7       11    0
7  GroupC  Name8       22    1