Python: Как удалить список общих слов из названий компаний? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть несколько тысяч распространенных слов, таких как LLC, INC, CO, которые мне нужно удалить в конце нескольких миллионов названий компаний в столбце данных pandas. Следующее удаляет общие слова в любой позиции:

toexlude = dfwcomwords['ending'].tolist()

data['names'] = data['names'].apply(lambda x: ' '.join([word for word in x.split() if word not in (toexclude)]))

Но я хочу удалить только слова из конца имени, то есть "INC INTERNATIONAL LLC" должно быть "INC INTERNATIONAL". (Вышеуказанное делает его «МЕЖДУНАРОДНЫМ».) Любая помощь будет принята с благодарностью.

Редактировать: после предложения @ba_ul ниже я получаю несбалансированную ошибку скобок

for word in toexclude:
    data['names'] = data['names'].apply(lambda x: re.sub(rf'{word}$', '', x, flags=re.IGNORECASE))

Traceback (most recent call last):

  File "<ipython-input-139-c68049bc0f0d>", line 2, in <module>
    data['names'] = data['names'].apply(lambda x: re.sub(rf'{word}$', '', x, flags=re.IGNORECASE))

  File "/anaconda3/envs/pandas/lib/python3.7/site-packages/pandas/core/series.py", line 4042, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)

  File "pandas/_libs/lib.pyx", line 2228, in pandas._libs.lib.map_infer

  File "<ipython-input-139-c68049bc0f0d>", line 2, in <lambda>
    data['names'] = data['names'].apply(lambda x: re.sub(rf'{word}$', '', x, flags=re.IGNORECASE))

  File "/anaconda3/envs/pandas/lib/python3.7/re.py", line 192, in sub
    return _compile(pattern, flags).sub(repl, string, count)

  File "/anaconda3/envs/pandas/lib/python3.7/re.py", line 286, in _compile
    p = sre_compile.compile(pattern, flags)

  File "/anaconda3/envs/pandas/lib/python3.7/sre_compile.py", line 764, in compile
    p = sre_parse.parse(p, flags)

  File "/anaconda3/envs/pandas/lib/python3.7/sre_parse.py", line 944, in parse
    raise source.error("unbalanced parenthesis")

error: unbalanced parenthesis

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Измените чек следующим образом:

data['names'] = data['names'].apply(
    lambda x: ' '.join([word for i, word in enumerate(x.split()) if not (
        i == len(x.split()) - 1 and word in toexclude)]))
1 голос
/ 13 октября 2019

Вы можете проверить word для двух условий: (1) находится ли оно в toexclude и (2) является ли оно последним словом в названии компании.

toexlude = dfwcomwords['ending'].tolist()

def remove_suffix(x):
    x_list = x.split()
    return ' '.join([word for index, word in enumerate(x_list) if not (word in toexclude and index == len(x_list) - 1)])

data['names'] = data['names'].apply(remove_suffix)

Редактировать: Для суффиксов, содержащихпробелы, вы можете сначала удалить их, используя регулярное выражение и функцию str.replace панд.

data['names'] = data['names'].str.replace('S. A. R. L.$', '')

# If you have multiple such unusual suffixes, you can chain all of them together
data['names'] = data['names'].str.replace('S. A. R. L.$', '').str.replace('L L C$', '')

$ в регулярном выражении гарантирует, что вы удаляете только те вхождения, которые находятся в конце имени.

Редактировать # 2: Основываясь на новых комментариях, возможно, лучшим решением будет чистое регулярное выражение. Это всего три строки, и они должны охватывать все случаи.

import re

for word in toexclude:
    data['names'] = data['names'].apply(lambda x: re.sub(r'\b{}$'.format(re.escape(word)), '', x, flags=re.IGNORECASE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...