Сравните элементы, разделенные запятой в двух столбцах - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть таблица с двумя столбцами, столбцами A и столбцом B. В каждом столбце есть элементы, разделенные запятой, как показано ниже.

enter image description here

Я хотел бы создать третий столбец (столбец C), который возвращает элементы, которые существуют в столбце A, но не существуют в столбце B

enter image description here

Буду признателен за любую помощь в этом.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Попробуйте следующий код (применение функции вдоль столбец по оси (1):

import pandas as pd
import re

# Source data
df = pd.DataFrame( data={'A': [ 'Lisa, John, Sam', 'Lisa, John, Sam' ],
    'B': [ 'Lisa, Peter, Sam', 'Lisa, Peter' ] })
pat = re.compile(r',\s*')
df['C'] = df.apply(lambda x: ', '.join(\
    set(re.split(pat, x.A)) - set(re.split(pat, x.B))), axis=1)

Результат:

                 A                 B          C
0  Lisa, John, Sam  Lisa, Peter, Sam       John
1  Lisa, John, Sam       Lisa, Peter  John, Sam
0 голосов
/ 18 ноября 2018

Вы можете использовать набор пересечения. Обратите внимание, что если вы используете pandas, производительность не будет хорошей, но возможно

inter = ds.A.str.split(',').apply(set) - ds.B.str.split(',').apply(set).values
df['C'] = inter.str.join(',')

Хотя я бы предложил чистый подход Python.

df['C'] = [','.join(set(a.split(',')) - set(b.split(','))) for a,b in zip(ds.A, ds.B)]

Сроки ясны

%timeit [','.join(set(a.split(',')) - set(b.split(','))) for a,b in zip(ds.A, ds.B)]
40.4 µs ± 1.08 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit ds.A.str.split(',').apply(set) - ds.B.str.split(',').apply(set).values
730 µs ± 27 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...