Если порядок не важен, ваше второе решение работает хорошо:
df['unique'] = [', '.join(set(x.split(', '))) for x in df['ID']]
print (df)
ID unique
0 nan, -1 -1, nan
1 647, 47 647, 47
2 603, 603 603
3 6036299, 6036299 6036299
Если порядок важен, используйте dict.fromkeys
для удаления дубликатов:
df['unique'] = [', '.join(dict.fromkeys(x.split(', ')).keys()) for x in df['ID']]
print (df)
ID unique
0 nan, -1 nan, -1
1 647, 47 647, 47
2 603, 603 603
3 6036299, 6036299 6036299
Если хотите удалить дубликаты все значения сложнее - разбить значения, изменить их на stack
, удалить дубликаты и объединить группы обратно:
data = {'ID':['nan, -1', '647, 47', '603, 603', '6036299, 6036299, 47']}
df = pd.DataFrame(data)
df['unique11'] = [', '.join(set(x.split(', '))) for x in df['ID']]
df['unique12'] = [', '.join(dict.fromkeys(x.split(', ')).keys()) for x in df['ID']]
df['unique2'] = (df['ID'].str.split(', ', expand=True)
.stack()
.drop_duplicates()
.groupby(level=0)
.agg(', '.join))
print (df)
ID unique11 unique12 unique2
0 nan, -1 -1, nan nan, -1 nan, -1
1 647, 47 647, 47 647, 47 647, 47
2 603, 603 603 603 603
3 6036299, 6036299, 47 47, 6036299 6036299, 47 6036299