根据另一个列值(类别)向 Pandas 中的重复(列)单元格值添加后缀

Add suffixes to duplicate (column) cell values in Pandas depending on another column value (category)

我有这样的结构:

   Data_group Data Value
    Group_x    A     12
    Group_x    A     13
    Group_x    B     3
    Group_x    C     3
    Group_x    C     32
    Group_x    C     23
    Group_y    A     8
    Group_y    A     7
    Group_y    B     13
    Group_y    C     12 
    Group_y    C     13
    Group_y    C     66

我想操作数据列以便将其作为输出:

   Data_group Data  Value
    Group_x    A[0]   12
    Group_x    A[1]   13
    Group_x    B      3
    Group_x    C[0]   3
    Group_x    C[1]   32
    Group_x    C[2]   23
    Group_y    A[0]   8
    Group_y    A[1]   7
    Group_y    B      13
    Group_y    C[0]   12 
    Group_y    C[1]   13
    Group_y    C[2]   66    

请注意,对于每个组,索引都会重置,并且当该数据只有一个条目时,没有后缀。 Value 列不参与重组。 我试图利用这个:

mask = df['Data'].duplicated(keep=False)
df['Data'] += mask.cumcount().add(1).astype(str).radd('_').mask(df['Data'].transform('count')==1,'') 

它将对重复的数据进行编号,但无论数据组如何,后缀都会递增。 我开始用嵌套的 if 和 for 来做,但它看起来很麻烦而且不起作用。 有没有一种干净的方法来使用 Pandas 方法得到那个结果?

您可以使用一个 groupby两个 Data_group/Data 列 。将 cumcount 计算为字符串(带括号)并仅添加到具有多个元素 (transform('size').gt(1)) 的组:

g = df.groupby(['Data_group', 'Data'])
df.loc[g['Data'].transform('size').gt(1),
       'Data'] += '['+g.cumcount().astype(str)+']'

输出:

   Data_group  Data  Value
0     Group_x  A[0]     12
1     Group_x  A[1]     13
2     Group_x     B      3
3     Group_x  C[0]      3
4     Group_x  C[1]     32
5     Group_x  C[2]     23
6     Group_y  A[0]      8
7     Group_y  A[1]      7
8     Group_y     B     13
9     Group_y  C[0]     12
10    Group_y  C[1]     13
11    Group_y  C[2]     66

中间体:

'['+g.cumcount().astype(str)+']'

0     [0]
1     [1]
2     [0]
3     [0]
4     [1]
5     [2]
6     [0]
7     [1]
8     [0]
9     [0]
10    [1]
11    [2]
dtype: object

g['Data'].transform('size').gt(1)

0      True
1      True
2     False
3      True
4      True
5      True
6      True
7      True
8     False
9      True
10     True
11     True
Name: Data, dtype: bool