Создавайте перестановки слов и складывайте их отдельные оценки вместе (Pandas, Python 3)

В настоящее время у меня есть df, который выглядит так:

Word     Score    Other
This      10       1
is        10       2    
an        20       5
example   50       3
great     20       2

То, что я делаю, — это создание перестановок на основе слов, найденных в столбце Word, и суммирование общей оценки переставляемых слов. Поскольку мой набор данных довольно существенный, я хочу создавать только те перестановки, в которых оценка превышает установленную общую сумму (в данном случае 50), чтобы ограничить общее количество возможных перестановок.

Ожидаемый результат:

**Permutations**         **Score**
an example                  70
example great               70
This example                60
etc...

Вопрос Как добавить оценку переставленных слов и сложить ее

В моем коде этого нет

import itertools
word = exact['Word']
score = exact['Score']
perm = list(itertools.permutations(word, 3))


removal = perm[perm['Score'] >= 50]

Есть идеи?

РЕДАКТИРОВАТЬ На основе помощи Гаррета:

exact = stuff[stuff['Other'] < 6 ]
def find_perms(df, min_score):
    perm = itertools.permutations(df.Word.unique(), 2)
    score = df.Score.to_dict()
    for p in perm:
        s = sum(score[w] for w in p)
        if s >= min_score:
           yield p, s

df = pd.DataFrame(list(find_perms(exact, 50000)),
              columns=['Permutations', 'Score'])

person user3682157    schedule 03.09.2014    source источник
comment
Вы должны сделать свой пример фрейма данных копируемым и вставляемым словарем. Позволяет людям воссоздать вашу ситуацию и дать совет   -  person DataSwede    schedule 03.09.2014
comment
Я отредактировал код — вы об этом подумали?   -  person user3682157    schedule 04.09.2014
comment
Нет, просто скопируйте и вставьте исходный фрейм данных вверху вашего вопроса. Как и этот вопрос: stackoverflow.com /вопросы/25653127/   -  person DataSwede    schedule 04.09.2014
comment
@DataSwede, для этого pd.read_clipboard()... :)   -  person Garrett    schedule 05.09.2014
comment
@Garrett Кажется, довольно много времени он неправильно создает фрейм данных, когда я его использую ...   -  person DataSwede    schedule 06.09.2014


Ответы (1)


Чтобы избежать выделения памяти для перестановок, которые не соответствуют желаемому порогу, возможно, вычислите оценку «на лету» перед созданием объекта pandas?

def find_perms(df, min_score):
    perm = itertools.permutations(df.Word.unique(), 2)
    score = df.Score.to_dict()
    for p in perm:
        s = sum(score[w] for w in p)
        if s >= min_score:
            yield p, s

df = pd.DataFrame(list(find_perms(df, 50)),
                  columns=['Permutations', 'Score'])
person Garrett    schedule 05.09.2014
comment
Ааа, я знал, что должна быть задействована функция yield - мой вопрос в том, как я могу сослаться на конкретный столбец, чтобы он был тем, который повторяется? Итак, в этом случае, как мне создать перестановки только из столбца слов, добавляя только столбец оценок? Спасибо! - person user3682157; 05.09.2014
comment
просто для дальнейшего объяснения - кажется, это работает, но он переставляет индексный столбец документа, тогда как мне нужен столбец «слова» - person user3682157; 05.09.2014
comment
а, обновлено, чтобы передать столбец df.Word вместо df.index в itertools.permutations() - person Garrett; 05.09.2014
comment
Эй, Гаррет, я действительно пробовал это и получаю сообщение об ошибке -- KeyError: 'This' каждый раз, когда я запускаю код. «Это» — первое слово в списке под заголовком «слово». Я обновил свой код выше, чтобы дать лучшую картину, но вызвана ли эта проблема тем фактом, что список слов в настоящее время является объектом Pandas? - person user3682157; 05.09.2014
comment
Вот частичная трассировка: строка 70, в find_perms s = sum(score[w] for w in p) ---- KeyError: 'This' - person user3682157; 05.09.2014
comment
Я бы рекомендовал включить отладчик и проверить значение всех локальных переменных в момент сбоя. Если вы можете предоставить полный пример, который воспроизводится, не стесняйтесь - person Garrett; 06.09.2014