Уникальные значения столбца 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