Сравните строку в столбце панд со строкой из другого столбца панд - PullRequest
0 голосов
/ 23 января 2019

У меня есть следующие панды

df:


colA

abc dbe fec
ghi jkl ref
sgsh hjo 


df2:


colB        colC

hjo              12
hhh chk          14
eee abc          17

Я хочу сравнить слова из строки из каждого столбца в df с каждым словом из строк в colB из df2.Если совпадение найдено, я хочу добавить соответствующий colC к df1.Если какое-либо слово соответствует colB, оно должно остановиться и перейти к следующему столбцу.

Результат:

newdf:


colA             colC

abc dbe fec       17
ghi jkl ref       none
sgsh hjo          12

Какой самый быстрый способ сделать это (огромный набор данных)

Как указано в решении,

pat:  

 '(Absolute Plumbing|D\xc3\xa9jeuner Eggcetera|Ivy Garcia, LMT|Native Bloom Landscape and Design|Seay\'s|Thulasi Kitchen|Liyuen|Viva Photo Booth|Cleopatra Internet Cafe|R&B\'s Pizza Place|Hilton Toronto/Markham Suites Conference Centre & Spa|Hegel Yoga|Boonda\'s|San Tan Aikido Kokikai|Mega Motors|Blue Sky Nails & Spa|Restaurant Cinq Epices|North East Auto Credit|Blind Tiger|T & S Towing' 

1 Ответ

0 голосов
/ 23 января 2019

Используйте это:

Составьте словарь справочной базы данных:

d = dict(zip(df2.colB,df2.colC))
#{'hjo': 12, 'hhh chk': 14, 'abc': 17}

создайте шаблон:

pat = r'({})'.format('|'.join(d.keys()))
#'(hjo|hhh chk|abc)'

Используйте s.str.extract и s.map()

df['colC']=df.colA.str.extract(pat, expand=False).dropna().map(d)
print(df)

         colA  colC
0  abc dbe fec  17.0
1  ghi jkl ref   NaN
2     sgsh hjo  12.0

РЕДАКТИРОВАТЬ для переключения escape-символа и пробела вкаждая строка * (Не уверен, что лучше, но работает) *

Учитывая, что df2:

     colB  colC
0      hjo    12
1  hhh ref    14
2      abc    17

и df1 такие же, как в вашем примере:

    colA
0   abc dbe fec
1   ghi jkl ref
2   sgsh hjo

import re
df_split=pd.DataFrame(df2.colB.str.split(' ').tolist(),index=df2.colC).stack().reset_index(0).rename(columns={0:'colB'}).reindex(df2.columns,axis=1)
print(df_split)

  colB  colC
0  hjo    12
0  hhh    14
1  ref    14
0  abc    17

вы заметите, что столбцы с пробелами преобразуются в строки с одинаковыми значениями

d = dict(zip(df_split.colB,df_split.colC))
#{'hjo': 12, 'hhh': 14, 'ref': 14, 'abc': 17}
keys=[re.sub('[^A-Za-z0-9]+', '', i) for i in d.keys()]
pat = r'({})'.format('|'.join(keys))
df['colC']=df.colA.str.extract((pat),expand=False).map(d)
print(df)
          colA  colC
0  abc dbe fec    17
1  ghi jkl ref    14
2    sgsh hjo     12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...