2015-06-23 4 views
0

У меня есть dataframe с названиями компаний. Я хочу рассчитать оценку для каждого имени, исходя из того, насколько распространены слова в названии.Векторизация списка в pandas

Во-первых, я создаю словарь слов для подсчета слов. Не уверен, если это чистый способ, но следующий Векторизованный подход работает:

words = itertools.chain.from_iterable(map(list, crsp.cname.str.split())) 

Я тогда сосчитать слова:

wordcnts = defaultdict(int) 
for w in words: 
    wordcnts[w] += 1 

Теперь я хотел бы вычислить оценку для каждого названия компании, равного на сумму обратного wordcnts[word] за каждое слово, которое появляется в названии компании.

Сейчас я итерация строк и используя список понимание для вычисления суммы:

score = {} 
for idx, row in crsp.iterrows(): 
    score[idx] = sum([1/wordcnts[w] for w in row.cname.split()]) 

Есть ли способ векторизации этот последний шаг?

+0

было бы помогите, если бы некоторые образцы данных работали с – nitin

+0

Несомненно, вот некоторые названия компаний: http://pastebin.com/hYsDzRNT – itzy

+0

Или, для удобства чтения в кастрюлю das: http://pastebin.com/y3zdWgbk – itzy

ответ

1

Я думаю, что вы можете сделать две вещи, чтобы ускорить вещи:

Заменить wordCnt на pd.DataSeries через:

words = itertools.chain.from_iterable(map(list, crsp.cname.str.split())) 
wordcnts = pd.Series(collections.Counter(words)) 

И использовать pd.DataFrame.apply для быстрой итерации:

score = crsp.cname.apply(lambda x: (1.0/wordcnts[x.split()]).sum()) 
+0

Спасибо, но я получаю сообщение об ошибке: 'IndexError: только целые числа, срезы (':'), ellipsis ('...'), numpy.newaxis ('None ') и целые или логические массивы являются действительными индексами'. Есть идеи? – itzy

+0

Извините за ошибку. Попробуйте еще раз с моим обновленным ответом. –

+0

О, я вижу. Благодаря! – itzy

Смежные вопросы