Вычтите Col A - Col B в кадре данных панд - PullRequest
3 голосов
/ 31 мая 2019

У меня есть два строковых столбца в кадре данных, и я хочу вычесть обычные слова из B из A.

A ->  Stack Overlflow is great            


B -> stack great


A-B -> overflow is

Я попробовал следующий код. Но это работает, только если в столбце B есть одно слово.

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

Могу ли я сделать какое-либо изменение, чтобы оно работало, когда в B несколько слов?

Ответы [ 3 ]

2 голосов
/ 31 мая 2019

Пример df:

>>> df = pd.DataFrame({'A': ['Stack Overlflow is great'], 'B': ['stack great']})

И вы можете использовать apply:

>>> df['A-B'] = df.apply(lambda x: ' '.join([i for i in x[0].split() if i.lower() not in x[1].split()]), axis=1)
>>> df
                          A            B           A-B
0  Stack Overlflow is great  stack great  Overlflow is
>>> 
2 голосов
/ 31 мая 2019

Вы можете использовать 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
0 голосов
/ 31 мая 2019

Попробуйте этот лайнер:

' '.join(list(set(list(df.A.str.lower().str.split(' '))[0])-set(list(df.B.str.lower().str.split(' '))[0])))

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

...