在pandas groupby之后的组中每连续两行之后指定索引号



我有一个如下的数据帧:

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

最新更新