我有一个如下的数据帧:
TileDesc ReportDesc UrlLink
'AA' 'New Report-1' 'link-1'
'AA' 'New Report-2' 'link-2'
'AA' 'New Report-1' 'link-1'
'AA' 'New Report-1' 'link-1'
'AA' 'New Report-1' 'link-1'
'BB' 'New Report-4' 'link-4'
'BB' 'New Report-2' 'link-2'
'BB' 'New Report-4' 'link-4'
'BB' 'New Report-6' 'link-6'
现在我想在其中添加一列,它将保持一个整数序列,该序列将在每连续2次之后发生变化。因此生成的数据帧看起来像:
TileDesc ReportDesc UrlLink Group
'AA' 'New Report-1' 'link-1' 1
'AA' 'New Report-2' 'link-2' 1
'AA' 'New Report-1' 'link-1' 2
'AA' 'New Report-4' 'link-4' 2
'AA' 'New Report-6' 'link-1' 3
'BB' 'New Report-4' 'link-4' 1
'BB' 'New Report-2' 'link-2' 1
'BB' 'New Report-4' 'link-4' 2
'BB' 'New Report-6' 'link-6' 2
我正在遵循ngroup()
方法,但无法通过。
df['Group'] = df.groupby(['TileDesc']).ngroup()
上面的代码片段为每个组提供了相同的组号。即,对于所有三个AA
,我得到0,然后对于所有BB
,我得到1,依此类推
我的第二种方法更像是:
df['Index'] = df.index + 1
df['Group'] = df['Index'].apply(lambda x : math.ceil(x/4))
但这不考虑TileDesc
我在这里缺少什么?
编辑组值仅在TileDesc组中每连续两行之后更改。
IIUC,您可以按分组并使用cumcount()
。添加的技巧是,您可以将初始的0(cumcount
从0开始)替换为空白,并替换为1(即bfill
):
df['Group'] = df.groupby('TileDesc').cumcount().replace(0,np.nan).bfill().astype(int)
结果:
TileDesc ReportDesc UrlLink Group
0 'AA' 'New Report-1' 'link-1' 1
1 'AA' 'New Report-2' 'link-2' 1
2 'AA' 'New Report-1' 'link-1' 2
3 'BB' 'New Report-4' 'link-4' 1
4 'BB' 'New Report-2' 'link-2' 1
5 'BB' 'New Report-4' 'link-4' 2
6 'CC' 'New Report-4' 'link-4' 1
7 'CC' 'New Report-2' 'link-2' 1
8 'CC' 'New Report-4' 'link-4' 2
9 'CC' 'New Report-4' 'link-4' 3
10 'CC' 'New Report-2' 'link-2' 4
11 'CC' 'New Report-4' 'link-4' 5
增加了额外的"CC"部分进行演示。
使用cumsum,但//2 +1
仅每隔一行增加
(对不起,我的复制粘贴有点坏,但它有效)
In [38]: df
Out[38]:
TileDesc ReportDesc UrlLink
0 'AA' Report-1' 'link-1'
1 'AA' Report-2' 'link-2'
2 'AA' Report-1' 'link-1'
3 'AA' Report-1' 'link-1'
4 'AA' Report-1' 'link-1'
5 'BB' Report-4' 'link-4'
6 'BB' Report-2' 'link-2'
7 'BB' Report-4' 'link-4'
8 'BB' Report-6' 'link-6'
In [39]: df['Group'] = df.groupby('TileDesc').cumcount() // 2 + 1
In [40]: df
Out[40]:
TileDesc ReportDesc UrlLink Group
0 'AA' Report-1' 'link-1' 1
1 'AA' Report-2' 'link-2' 1
2 'AA' Report-1' 'link-1' 2
3 'AA' Report-1' 'link-1' 2
4 'AA' Report-1' 'link-1' 3
5 'BB' Report-4' 'link-4' 1
6 'BB' Report-2' 'link-2' 1
7 'BB' Report-4' 'link-4' 2
8 'BB' Report-6' 'link-6' 2