根据另一个列值(类别)向 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
我有这样的结构:
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