Решение: добавьте все значения с GroupBy.cumcount
в качестве счетчика (и замените значения 0
пустыми строками для игнорирования каждого первого дублирования):
df['Reagent'] += df.groupby(['Name','Reagent']).cumcount().astype(str).replace('0','')
print (df)
Name Reagent
0 Experiment1 water
1 Experiment1 oil
2 Experiment1 water1
3 Experiment1 milk
4 Experiment1 water2
5 Experiment1 tea
6 Experiment1 water3
7 Experiment1 coffee
8 Experiment2 water
9 Experiment2 coffee
При необходимостизамените только все дупсеты по обоим столбцам фильтра строк на DataFrame.duplicated
для обоих столбцов и добавьте 1
:
mask = df.duplicated(['Name','Reagent'], keep=False)
df.loc[mask, 'Reagent'] += df[mask].groupby(['Name','Reagent']).cumcount().add(1).astype(str)
print (df)
Name Reagent
0 Experiment1 water1
1 Experiment1 oil
2 Experiment1 water2
3 Experiment1 milk
4 Experiment1 water3
5 Experiment1 tea
6 Experiment1 water4
7 Experiment1 coffee
8 Experiment2 water
9 Experiment2 coffee