Вы можете использовать np.setdiff1d()
:
df['A-B']=df.apply(lambda x: ' '.join(np.setdiff1d(x['A'].lower().split(),
x['B'].lower().split())),axis=1)
print(df)
A B A-B
0 Stack Overlflow is great stack great is overlflow
Ваше решение почти готово, просто добавьте series.str.lower()
при архивировании:
df['A-B']=[' '.join(set(a.split())-set(b.split()))
for a, b in zip(df['A'].str.lower(), df['B'].str.lower())]
Если в серии есть повторяющиеся строки, используйте OrderedDict
, который помогает удалять дубликаты как set()
, но также поддерживает порядок:
df = pd.DataFrame({'A': ['Stack Overlflow is great is great'], 'B': ['stack great']})
A B
0 Stack Overlflow is great is great stack great
from collections import OrderedDict
df['A-B']=[' '.join([ele for ele in OrderedDict.fromkeys(a) if ele not in b ])
for a,b in zip(df.A.str.lower().str.split(),df.B.str.lower().str.split())]
print(df)
A B A-B
0 Stack Overlflow is great is great stack great overlflow is