Категоризация столбца с использованием ключа словаря - пары с несколькими значениями - PullRequest
1 голос
/ 15 марта 2019

У меня есть словарь:

'Consulting': {'Deloitte', 'EY', 'KPMG', 'PwC'},
'Education': {'.edu', 'College', 'University'},
'Government':{'state','.gov','city'},
'Corporate':{'corpor','consumer','care'},
 ...... etc.

У меня есть фрейм данных:

 Sno  Text            column1    column2 ......
  1   Deloitte.com
  2   Texas.gov
  3   smi@EY.com
  4   UTD.edu
  5   rapper@corporate.com

 ..... etc.

Я хочу использовать словарь для категоризации фрейма данных и построения столбца Category, например:

 Sno  Text                   Category       column1    column2 ......
  1   Deloitte.com           Consulting
  2   Texas.gov              Government
  3   smi@EY.com             Consulting
  4   UTD.edu                Education
  5   rapper@corporate.com   Corporate
 ..... etc.

Как я могу использовать словарь с несколькими значениями в python, чтобы найти полную фразу или часть фразы в столбце Text и классифицировать ее?Можем ли мы использовать ту же логику в случае совпадения 2?Что будет потом?

Кроме того, это может звучать неопределенно, но я использую Словарь, потому что мы можем сопоставить несколько значений одной категории, есть ли лучший способ сделать это без словаря?

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Это также можно сделать с помощью re и np.vectorize:

cat = re.compile('|'.join(f"(?P<{k}>{'|'.join(v)})" for k,v in categories.items()))
df['category'] = np.vectorize(lambda x: cat.search(x).lastgroup)(df.text)

Это дало мне:

                   text    category
0          Deloitte.com  Consulting
1             Texas.gov  Government
2            smi@EY.com  Consulting
3               UTD.edu   Education
4  rapper@corporate.com   Corporate

В основном я создаю строку регулярного выражения, состоящую из ключей dict категории в качестве имен групп и значений в виде шаблона, разделенного на | , что означает or. Затем vectorize используется для сопоставления этого поиска регулярных выражений с каждым элементом, получая найденное имя соответствующей группы

1 голос
/ 15 марта 2019

IIUC после воссоздания dict do с findall, затем сопоставьте его с

newdict = {i: k for k, v in d.items() for i in v}
df.Text.str.findall('|'.join(newdict.keys())).str[0].map(newdict)
Out[431]: 
0    Consulting
1    Government
2    Consulting
3     Education
4     Corporate
Name: Text, dtype: object

df['cate']=df.Text.str.findall('|'.join(newdict.keys())).str[0].map(newdict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...