If order is not important your second solution working nice:
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
If order is important then use dict.fromkeys for remove duplicates:
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
If want remove duplicates of all values it is more complicated - split values, reshape by stack, remove duplicates and join groups back:
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
6036299, 6036299is changed to6036299, 6036299, 47then expected output is6036299or6036299, 47?