Альтернатива CountVectorizer с объектами Counter - PullRequest
0 голосов
/ 21 января 2020

У меня довольно большой DataFrame (несколько тысяч строк) с двумя столбцами: идентификатором и объектом Counter для тегов, связанных с идентификатором. Счетчик подсчитывает, сколько раз элемент был связан с этим конкретным тегом.

Каждый элемент может иметь разные теги, а общее количество тегов также составляет тысячи.

Пример:

df = pd.DataFrame([[1, Counter({'a': 4, 'b': 2})],
                   [2, Counter({'b': 1, 'c': 3})],
                   [3, Counter({'a': 3, 'c': 5, 'd': 1})]],
                  columns=['ID', 'count'])

Моя цель - получить матрицу подсчета тегов, аналогичную той, которую я получу при использовании CountVectorizer () для текста.

Мои ограниченные знания побудили меня написать это код:

# Create empty list
list = []

# iterate trough DataFrame
for item in df.itertuples():

    table = pd.DataFrame.from_dict(item.count, orient='index').reset_index()
    table.columns = ['tag', item.ID]
    list.append(table)

tag_table = pd.concat(list, sort=False)

Но на самом деле это не работает.

Ну, это может сработать, но все еще обрабатывается, так как append и concat общеизвестно медленны.

Как можно Я решаю проблему более эффективно?

Спасибо!

1 Ответ

0 голосов
/ 21 января 2020

Вы можете использовать DictVectorizer :

import pandas as pd
from sklearn.feature_extraction import DictVectorizer

df = pd.DataFrame([[1, Counter({'a': 4, 'b': 2})],
                   [2, Counter({'b': 1, 'c': 3})],
                   [3, Counter({'a': 3, 'c': 5, 'd': 1})]],
                  columns=['ID', 'count'])

dv = DictVectorizer()

dv.fit_transform(df["count"]).toarray()
# array([[4., 2., 0., 0.],
#        [0., 1., 3., 0.],
#        [3., 0., 5., 1.]])
...