Уникальные значения столбца df которые не входят в другой столбец

Есть 2 датафрейма:

data2 = {'CustomerID': ['c27boh'],
         'unique_codes': ['cjncee']}
data1 = {'CustomerID': ['c27boh'],
         'unique_codes': ['cjncee, cktvug']}

Нужно по каждому CustomerID сравнить значения в unique_codes и заполнить в новом столбце датафрейма data1 только те уникальные значения из unique_codes, которых нет в data2.

data1:

CustomerID unique_codes
c27boh cjncee

data2:

CustomerID unique_codes
c27boh cjncee, cktvug

Ожидаемый результат: data1

CustomerID unique_codes new_unique_codes
c27boh cjncee, cktvug cktvug

Ответы (2 шт):

Автор решения: CrazyElf

Что-то самому стало интересно. Ну, решение в общем-то "влоб", не уверен, что можно проще сделать:

data1['new_unique_codes'] = data1.join(data2, rsuffix='_') \
    .apply(lambda x: ','.join(set(x['unique_codes'].split(',')) 
                            - set(x['unique_codes_'].split(','))), axis=1)

Просто вычитаем из одного множества другое. Ну, попутно нужно сначала разбить строки по запятой, а в конце что получилось наоборот склеить.

→ Ссылка
Автор решения: Алексей Р

Вариант решения с использованием .merge() с аргументом indicator=True, который показывает, из какого фрейма взяты данные при слиянии.

data2 = {'CustomerID': ['c27boh'],
         'unique_codes': ['cjncee']}
data1 = {'CustomerID': ['c27boh'],
         'unique_codes': ['cjncee, cktvug']}

df = (pd.DataFrame(data1).set_index('CustomerID').unique_codes.str.split('\s*,\s*').explode().to_frame()
      .merge(pd.DataFrame(data2).set_index('CustomerID'), on=['CustomerID', 'unique_codes'], how='outer', indicator=True))
df._merge = df.unique_codes.where(df._merge.eq('left_only'))
df = df.groupby('CustomerID').agg(lambda col: ', '.join(col.dropna())).rename(columns={'_merge': 'new_unique_codes'}).reset_index()
print(df)
  CustomerID    unique_codes new_unique_codes
0     c27boh  cjncee, cktvug           cktvug
→ Ссылка